2015-10-20 93 views
1

当页面加载时,一切正常。但是当我提交表单时,我的下拉列表在页面刷新后丢失了先前选择的项目。如何在表单提交后保留级联下拉菜单选项?

如何修改我的函数以初始化下拉列表并保留之前选定的项目(如果存在)。

这是我与初始化我dropdownlists javascript的观点:

@model Models.Book 

@{ 
    ViewBag.Title = "Index"; 
} 

@section scripts { 
<script type="text/javascript"> 
    $(function() { 
     $.getJSON("/Home/Books/List", function(data) { 
      var items = "<option>--------------------</option>"; 
      $.each(data, function(i, book) { 
       items += "<option value='" + book.Value + "'>" + book.Text + "</option>"; 
      }); 
      $("#Books").html(items); 
     }); 

     $("#Books").change(function() { 
      $.getJSON("/Home/Chapters/List/" + $("#Books> option:selected").attr("value"), function(data) { 
       var items = "<option>--------------------</option>"; 
       $.each(data, function(i, chapter) { 
        items += "<option value='" + chapter.Value + "'>" + chapter.Text + "</option>"; 
       }); 
       $("#Chapters").html(items);       
      }); 
     });    
    });    
</script> 
} 

@using (@Html.BeginForm("ListChapterContent", "Home")) 
{ 
<div id="header"> 
    <label for="Books">Books</label> 
    <select id="Books" name="Books"></select> 

    <label for="Chapters">Chapters</label> 
    <select id="Chapters" name="Chapters" onchange="this.form.submit();"></select>   
</div> 

这里是我的模型:

public class Book 
{ 
    public string Translator{ get; set; } 
    public string Edition{ get; set; } 
    public List<Book> Books{ get; set; } 
    public int SelectedBook { get; set; } 
    public int SelectedChapter { get; set; } 
} 
+1

您需要使用HtmlHelpers来生成你的控件 - 例如@ Html.DropDownListFor(m => m.Books,Model.BookList)',并且在返回视图之前应该在控制器中生成选项。 –

+0

选定的图书和所选章节正在我的表单提交中的控制器中的模型上设置。这个信息可以在我的视图中访问,因为它是一个强类型的视图,但我不知道如何处理它。 – Daniel

+0

我试过使用HtmlHelpers,但我可以注意到它们是作为级联dropdownlist工作的,所以我在YouTube上的一个例子中找到了这个函数,并用它来代替。 – Daniel

回答

2

使用HtmlHelpers生成您的控件,而不是手动创建你的HTML,所以你获得2路模型绑定。如果你使用一个视图模型,你会发现这个最简单的

public class BookVM 
{ 
    [Required] 
    public int? SelectedBook { get; set; } 
    [Required] 
    public int? SelectedChapter { get; set; } 
    public SelectList BookList { get; set; } 
    public SelectList ChapterList { get; set; } 
} 

控制器

public ActionResult Create() 
{ 
    BookVM model = new BookVM(); 
    ConfigureViewModel(model); 
    return View(model); 
} 

private void ConfigureViewModel(BookVM model) 
{ 
    IEnumerable<Book> books = db.Books; 
    model.BookList = new SelectList(books, "ID", "Name"); 
    if (model.SelectedBook.HasValue) 
    { 
    IEnumerable<Chapter> chapters= db.Books.Where(c => c.BookId == model.SelectedBook.Value); 
    model.ChapterList = new SelectList(chapters, "ID", "Name"); 
    } 
    else 
    { 
    model.ChapterList = new SelectList(Enumerable.Empty<SelectListItem>()); 
    } 
} 

,并在视图

@model BookVM 
@using (@Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.SelectedBook) 
    @Html.DropDownListFor(m => m.SelectedBook, Model.BookList, "-Please select-") 
    @Html.ValidationMessageFor(m => m.SelectedBook) 

    @Html.LabelFor(m => m.SelectedChapter) 
    @Html.DropDownListFor(m => m.SelectedChapter, Model.ChapterList) 
    @Html.ValidationMessageFor(m => m.SelectedChapter) 
} 

然后你的脚本变为(删除第一个)

var url = '@Url.Action("FetchChapters")'; // don't hard code url's 
var chapters = $('#SelectedChapter'); 
$('#SelectedBook').change(function() { 
    if (!$(this).val()) { 
    return; 
    } 
    $.getJSON(url, { id: $(this).val() }, function(data) { 
    chapters.empty().append($('<option></option>').val('').text('-Please select-')); 
    $.each(data, function(index, chapter) { 
     subLocalities.append($('<option></option>').val(item.Value).text(item.Text));    
    }); 
    }); 
}); 

和你方法t O返回的JSON将

public JsonResult FetchSubLocalities(int ID) 
{ 
    var chapters= db.Books.Where(c => c.BookId == ID).Select(c => new 
    { 
    Value = c.ID, 
    Name = c.Name 
    }); 
    return Json(chapters, JsonRequestBehavior.AllowGet); 
} 
在POST方法

最后,如果你需要返回视图

[HttpPost] 
public ActionResult Create(BookVM model) 
{ 
    if(!ModelState.IsValid) 
    { 
    ConfigureViewModel(model); 
    return View(model); 
    } 
    .... 

也可以参考这个DotNetFiddle一个类似的例子

相关问题