1

我有一个 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);
        }
    }
}

个人创建模型

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 为空,而且我无法清除 AddContact 文本框。

我在网上和 Stackoverflow 上都搜索过,但没有找到任何答案,这里有一个未回答的问题

PS:我是 MVC 的新手,来自 ASP.NET Webforms。

4

1 回答 1

0

以我个人的观点,我认为更好的方法是在客户端处理联系人“添加”,如果您没有在服务器端对联系人的数据做任何“有用”的事情(比如保存到数据库或别的东西)。

通过使用 jQuery 的几行 JavaScript,您可以为每个新联系人动态添加新的文本输入,当用户完成后,他只需点击提交,只需一次调用即可将所有信息发送到服务器。

这种方法会更好,原因有两个,首先不会刷新页面以分散用户的注意力,其次您将避免用户多次调用服务器,这可能意味着根据您的流量节省 100 或 1000 次调用。

编辑:

这是一个非常简化的示例,当然您应该添加更多功能和样式。

您的视图模型应该看起来像这样才能正常工作:

public class PersonCreateModel
{
    public Person Person { get; set; }
    public List<Contact> Contacts { get; set; }
}

这是一个常见的问题,所以必须有很多其他的解决方案,看看这个方法也有点“旧”,但概念仍然适用。

于 2014-01-12T09:17:11.803 回答