0

对 MVC 等来说很新。我有一个看起来像这样的类:

public class SomeExampleModel
{
    public int Id { get; private set; }
    public string Name { get; private set;}
    public string Street { get; private set; }
    public IList<Contact> Contacts { get; private set; }
    ...
}

哪里Contact看起来像:

public class Contact
{
    public int Id { get; private set; }
    public int SomeExampleModelId { get; private set; }
    public ContactType Type { get; private set; }
    public string ContactValue { get; private set; }
...
}

现在的问题是,我有一个 PostCreate操作和 Create.cshtml 视图来添加新到SomeExampleModel我的数据库。它适用于所有基本属性,但没有任何联系人属性(它是数据库中的单独表)。

我如何能够在我的视图中使用表单添加联系人(现在是单一的,将来是复数的)?

编辑:如果我不清楚,我很抱歉。问题是没有将数据正确保存在数据库中。我已经对此进行了测试,如果我只是使用 SomeExampleContext 手动将 SomeExampleModel 记录插入到数据库中,它就可以正常工作。我不知道如何起草我的视图,以便它允许用户将联系人添加到记录中

4

2 回答 2

1

这是使用EditorTemplate. 我对您的模型类进行了细微更改(这可行;但是,请注意,这只是为了让您理解这个概念。您可以对此进行扩展)

楷模

public class SomeExampleModel
{
    public int Id { get; set; }
    public string Name { get; set;}
    public string Street { get; set; }
    public IList<Contact> Contacts { get; set; }    
}

public class Contact
{
    public int Id { get; set; }
    public int SomeExampleModelId { get; set; }
    public ContactType Type { get; set; }
    public string ContactText { get { return Type.ToString(); } }
    public string ContactValue { get; set; }
}

public enum ContactType
{
    email,
    Phone,
    mobile,
    fax
}

记下我创建了一个ContactText返回枚举文本的属性(用于显示目的)

为联系人创建一个编辑器模板(命名为Contact.cshtml;模板名称必须与类名匹配)。在屏幕截图下方找到放置编辑器模板的位置。

在此处输入图像描述

这是代码Contact.cshtml

@model Test1.Models.Contact
<table>
@Html.HiddenFor(a=>a.Type)
<tr>
 <td>@Html.Label(Model.ContactText)</td>
 <td>@Html.TextBoxFor(a => a.ContactValue)</td>
</tr>
</table>

这是“创建”视图的代码(ExampleCreateView.cshtml在我的例子中)

@model Test1.Models.SomeExampleModel

@{
    ViewBag.Title = "ExampleCreateView";
}

<h2>ExampleCreateView</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>SomeExampleModel</legend>
        @Html.HiddenFor(model=>model.Id)
        <table>
            <tr>
                <td>@Html.LabelFor(model=>model.Name)</td>
                <td>@Html.EditorFor(model=>model.Name)</td>
            </tr>
            <tr>
                <td>@Html.LabelFor(model=>model.Street)</td>
                <td>@Html.EditorFor(model=>model.Street)</td>
            </tr>
            <tr>
                <td>@Html.LabelFor(model=>model.Contacts)</td>
                <td>@Html.EditorFor(model=>model.Contacts)</td>
            </tr>
        </table>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

记下我是如何使用@Html.EditorForContacts物业的。

下面是 Get、Post 操作的样子

    public ActionResult ExampleCreateView()
    {
        SomeExampleModel model = new SomeExampleModel();
        Contact contactEmail = new Contact();
        contactEmail.Type = ContactType.email;

        Contact contactFax = new Contact();
        contactFax.Type = ContactType.fax;

        Contact contactPhone = new Contact();
        contactPhone.Type = ContactType.Phone;

        Contact contactMobile = new Contact();
        contactMobile.Type = ContactType.mobile;

        List<Contact> contacts = new List<Contact>();

        contacts.Add(contactEmail);
        contacts.Add(contactFax);
        contacts.Add(contactPhone);
        contacts.Add(contactMobile);

        model.Contacts = contacts;

        return View(model);
    }

    [HttpPost]
    public ActionResult ExampleCreateView(SomeExampleModel model)
    {
        //Your operations
        return View(model);
    }

运行应用程序。这就是视图的样子

在此处输入图像描述

您将在 POST 操作中获得的内容的屏幕截图

在此处输入图像描述

于 2012-06-20T03:47:49.177 回答
0

我会这样做的方式是有两个单独的操作 - 一个执行初始创建 的SomeExampleModel操作,以及一个用于将 a 添加Contact到该模型的单独操作。

这样,您的创建SomeExampleModel视图将只有名称和街道,当它保存时,您将显示SomeExampleModel. 的只读版本SomeExampleModel将在名称和街道下方的表格中列出所有相关联系人,并带有编辑和删除链接,以及表格下方的“添加新”联系人链接

例如

<table>
@foreach (var contact in Model.Contacts)
{
    <tr>
        <td>@contact.ContactType</td>
        <td>@contact.ContactValue</td>
        <td>@Html.Action("Edit", "Edit", "Contact",  new { id = contact.Id }</td>
        <td>@Html.Action("Delete", "Delete", "Contact", { id = contact.Id }</td>
    </tr>
}
</table>
@Html.Action("Add new contact", "Add", "Contact" new { id = Model.Id }

最初,不会列出任何联系人,然后您将拥有多个联系人。

于 2012-06-20T03:41:41.350 回答