SQL*_*der 6 asp.net-mvc-4 entity-framework-5
我有一个MVC4页面,其中包含一个表单,其中包含一组复选框,单选按钮和用作搜索字段的文本框.在发布后,将解析选择,并使用新结果更新下部结果网格.现在,所有表单值在返回时都被清除,新结果显示在网格中 - 只有网格是模型的一部分.
我希望所有表单选择在发布后保留其值,以便用户可以查看(和更改)下一个帖子/搜索的选择.表格上印有viewbags.
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "searchform" }))
{
@Html.ValidationSummary("Please correct the following errors")
<div style="float:left;">
<div style="float:left;">
<label>Name:</label>
@Html.TextBox("name")
</div>
<div style="float:left; margin-left:15px">
<label>Company:</label>
@Html.TextBox("company")
</div>
<div style="float:left; margin-left:65px">
<label>Date Range:</label>
@Html.TextBox("dateStart", "", new { @class = "datefield", type = "date" })
to
@Html.TextBox("dateEnd", "", new { @class = "datefield", type = "date" })
</div>
</div>
<div style="clear: both;">
Match Any Categories? <input type="radio" name="categoryMatchAll" value="false" checked="checked" />
Match All Categories? <input type="radio" name="categoryMatchAll" value="true" />
</div>
<div style="float:left;">
<div id="searchform-categories" style="float:left;">
<div class="scroll_checkboxes">
<label>Categories</label>
<ul>
@foreach (var x in ViewBag.Categories)
{
<li>
<input type="checkbox" name="categories" value="@x.Id"/>
@x.Name
</li>
}
</ul>
</div>
</div>
<div id="searchform-diversity" style="float:left; margin-left:30px">
<div class="search-selection" style="float:left;">
<label>Minority Owned</label>
<ul>
@foreach (var x in ViewBag.Minorities)
{
<li>
@Html.RadioButton("minorities", (String)x.Id.ToString())
@x.Name
</li>
}
</ul>
</div>
<div class="search-selection" style="float:left;">
<label>Diversity Class</label>
<ul>
@foreach (var x in ViewBag.Classifications)
{
<li>
@Html.RadioButton("classifications", (String)x.Id.ToString())
@x.Name
</li>
}
</ul>
</div>
</div>
</div>
<div style="clear: both;">
<input type="submit" value="Search Profiles" />
<input type="submit" value="Reset" />
</div>
}
Run Code Online (Sandbox Code Playgroud)
数据网格绑定到模型中
@model IEnumerable<VendorProfileIntranet.Models.VendorProfile>
<table id="VendorTable" width="100%" class="gradeA">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.CompanyName)
</th>
<th>
@Html.DisplayNameFor(model => model.City)
</th>
<th>
@Html.DisplayNameFor(model => model.State)
</th>
<th>
@Html.DisplayNameFor(model => model.DateCreated)
</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td class="list-field">
@Html.DisplayFor(modelItem => item.Name)
</td>
<td class="list-field">
@Html.DisplayFor(modelItem => item.CompanyName)
</td>
<td class="list-field">
@Html.DisplayFor(modelItem => item.City)
</td>
<td>
@Html.DisplayFor(modelItem => item.State)
</td>
<td class="list-field">
@Html.DisplayFor(modelItem => item.DateCreated)
</td>
<td class="list-field">
@Html.ActionLink("Edit", "Edit", new { id = item.ProfileID }) |
@Html.ActionLink("View", "View", new { id = item.ProfileID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.ProfileID }, new { onclick = " return DeleteConfirm()" })
</td>
</tr>
}
</tbody>
<tfoot>
<tr>
<td> </td>
</tr>
</tfoot>
Run Code Online (Sandbox Code Playgroud)
这就是我通常解决这个问题的方法。我的笔记纯粹是我关于在 MVC 项目中命名类以明确其目的的观点(宗教?)。
几个保持可扩展性的接口:
// be specific about what type of results, both in the name of the
// interface and the property needed, you don't want to have overlapping
// properies on your classes, I like suffixing interfaces that are specific
// to a View or Partial View with View
public interface IPersonSearchResultsView
{
IEnumerable<EFPerson> PersonSearchResults { get; }
}
public interface IPersonSearchCriteriaView
{
PersonSearchCriteriaModel PersonSearchModel { get; }
}
Run Code Online (Sandbox Code Playgroud)
几节课
// I like suffixing classes that I only use for MVC with Model
public PersonSearchCriteriaModel
{
public string Name {get; set;}
public string Company {get; set;}
public string DateStart {get; set;}
public string DateEnd {get; set;}
}
// I like suffixing classes that I used passed to a View/Partial View
// with ViewModel
public class PersonSearchViewModel : IPersonSearchResultsView,
IPersonSearchCriteriaView
{
public IEnumerable<EFPerson> PersonSearchResults { get; set; }
public PersonSearchCriteriaModel PersonSearchModel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在对于您的控制器,我将以一种也允许您将来执行 Ajax 的方式设置它们。
public PersonController : Controller
{
public ActionResult Search()
{
var model = new PersonSearchViewModel();
// make sure we don't get a null reference exceptions
model.PersonSearchModel = new PersonSearchCriteriaModel ();
model.PersonSearchResults = new List<EFPerson>();
return this.View(model);
}
[HttpPost]
public ActionResult Search(PersonSearchViewModel model)
{
model.PersonSearchResults = this.GetPersonResults(model.PersonSearchModel);
return this.View(model)
}
// You could use this for Ajax
public ActionResult Results(PersonSearchViewModel model)
{
model.PersonSearchResults = this.GetPersonResults(model.PersonSearchModel);
return this.Partial("Partial-SearchResults", model)
}
private GetPersonResults(PersonSearchCriteriaModel criteria)
{
return DbContext.GetPersonResults(criteria)
}
}
Run Code Online (Sandbox Code Playgroud)
在您的视图中创建几个部分视图。
/Views/Person/Partial-SearchCriteria.cshtml
@model IPersonSearchCriteriaView
// the new part is for htmlAttributes, used by Ajax later
@using (Html.BeginForm(..., new { id="searchCriteria" }))
{
// Here is were the magic is, if you use the @Html.*For(m=>)
// Methods, they will create names that match the model
// and you can back back to the same model on Get/Post
<label>Name:</label>
@Html.TextBoxFor(m => Model.PersonSearchModel.Name)
// or let mvc create a working label automagically
@Html.EditorFor(m => Model.PersonSearchModel.Name)
// or let mvc create the entire form..
@Html.EditorFor(m => Model.PersonSearchModel)
}
Run Code Online (Sandbox Code Playgroud)
/Views/Person/Partial-SearchResults.cshtml
@model IPersonSearchResultsView
@foreach (var person in Model.PersonSearchResults )
{
<tr>
<td class="list-field">
@Html.DisplayFor(modelItem => person.Name)
</td>
// etc
</tr>
}
Run Code Online (Sandbox Code Playgroud)
最后是视图:
/Views/Person/Search.cshtml
@model PersonSearchViewModel
@Html.Partial("Partial-SearchCriteria", Model)
// easily change the order of these
<div id="searchResults">
@Html.Partial("Partial-SearchResults", Model);
</div>
Run Code Online (Sandbox Code Playgroud)
现在启用 Ajax 非常简单(简化了,我的并不完全正确):
$.Ajax({
url: '/Person/Results',
data: $('#searchCriteria').serialize(),
success: function(jsonResult)
{
$('#searchResults').innerHtml(jsonResult);
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18126 次 |
最近记录: |