使用集合属性插入视图

时间:2014-01-09 00:33:39

标签: c# asp.net-mvc-5 asp.net-mvc-views

我有一个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。

1 个答案:

答案 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它也有点“陈旧”,但概念仍然适用。