我有一个Person类和一个Contact类。 一个人可以有很多联系。
public class Person
{
[Required]
public string FirstName { get; set; }
public string LastName { get; set; }
public string Notes { get; set; }
[Required]
public List<Contact> Contacts { get; set; }
public Person()
{
Contacts = new List<Contact>();
}
}
public class Contact
{
[Required]
public string Title { get; set; }
[Required]
public string Value { get; set; }
public Contact() { Title = ""; Value = ""; }
public Contact(string title, string value)
{
Title = title;
Value = value;
}
}
控制器:
public class PersonController : Controller
{
public ActionResult Create()
{
return View(new PersonCreateModel());
}
// POST: /Person/Create
[HttpPost]
public ActionResult Create(string btnSubmit, PersonCreateModel personModel)
{
try
{
switch (btnSubmit)
{
case "AddContact":
personModel.Person.Contacts.Add(new Contact(personModel.NewContact_Title, personModel.NewContact_Value));
personModel.NewContact_Title = personModel.NewContact_Value = "";
return View(personModel);
case "CreatePerson"://Add To Database
//blabla
break;
}
return RedirectToAction("Index");
}
catch
{
return View(personModel);
}
}
}
PersonCreateModel :
public class PersonCreateModel
{
public Person Person { get; set; }
public string NewContact_Title { get; set; }
public string NewContact_Value { get; set; }
public PersonCreateModel()
{
Person = new Person();
}
}
查看:
@model MvcApplication1.Models.PersonCreateModel
@{
ViewBag.Title = "Create";
var contactsGrid = new WebGrid(Model.Person.Contacts);
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Person</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Person.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Person.FirstName)
@Html.ValidationMessageFor(model => model.Person.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Person.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Person.LastName)
@Html.ValidationMessageFor(model => model.Person.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Person.Notes)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Person.Notes)
@Html.ValidationMessageFor(model => model.Person.Notes)
</div>
<br />
<div>
<h4>Contacts:</h4>
<table>
<tr>
<td>Title: @Html.EditorFor(model => model.NewContact_Title)</td>
<td>Value: @Html.EditorFor(model => model.NewContact_Value)</td>
<td>
<input type="submit" name="btnSubmit" value="AddContact" /></td>
</tr>
</table>
<div>
@contactsGrid.GetHtml()
</div>
</div>
<p>
<input type="submit" name="btnSubmit" value="CreatePerson" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
我想要完成的是,用户可以在最终点击“创建”之前向Person添加多个联系人。
我有两个问题:
1-这是最好的方法吗?是不是像使用javascript或jquery那样更简单/更短的方式?
2-当我第一次单击AddContact时它很好,第二次Person.Contacts为Empty,而且我也无法清除AddContact文本框。
我在网上搜索了Stackoverflow,但我没有找到任何答案,还有一个未回答的问题here
PS:我是MVC的新手,来自ASP.NET Webforms。
答案 0 :(得分:0)
在我个人的观点中,我认为更好的方法是在客户端处理联系人“添加”,如果你没有在服务器端对联系人的数据做任何“有用”(比如保存)到数据库或其他东西)。
使用jQuery的JavaScript行很少,您可以为每个新联系人动态添加新的文本输入,当用户完成后,他只需点击提交并在一次调用中将所有信息发送到服务器。
这种方法会更好,原因有两个,首先是没有页面刷新以分散用户的注意力,第二种方法是避免用户多次调用服务器,这可能意味着根据您的流量节省了100或1000次呼叫。 / p>
修改强>
This is a very simplified example它可能是什么,当然你应该添加更多功能和样式。
您的视图模型应如下所示:
public class PersonCreateModel
{
public Person Person { get; set; }
public List<Contact> Contacts { get; set; }
}
这是一个常见的问题,因此必须有很多其他解决方案,看看this approach它也有点“陈旧”,但概念仍然适用。