【问题标题】:How to select an existing object for a required relationship in MVC?如何在 MVC 中为所需关系选择现有对象?
【发布时间】:2014-07-30 19:18:13
【问题描述】:

我的域类:

public class Site
{
    [Key]
    public virtual int SiteId { get; set; }
    public virtual Address Address { get; set; } // Required
}

public class Address
{
    [Key]
    public virtual int AddressId { get; set; }
}

SiteCreate 视图仅包含以下文本框:

@Html.EditorFor(model => model.SiteId)

当我PostBack时,抛出异常,如下SiteController中所示:

[HttpPost]
public ActionResult Create([Bind(Include="SiteId,Name")] Site site)
{
    if (ModelState.IsValid)
    {
        db.Sites.Add(site);
        db.SaveChanges(); // ***Error Here***!!!
        return RedirectToAction("Index");
    }
        return View(site);
}

很明显,异常是由于缺少必需的“Address”对象。

我想选择一个现有的“Address”对象并将其包含在“Site”实体中。

我在我的视图中使用了一个 JQuery 对话框从数据库中选择了一个现有的“AddressId”。

我的问题是如何在我的视图中将“Address”对象插入“Site”? 或者将其传递给控制器​​并将其插入“Site”实体?

请帮忙。谢谢!

【问题讨论】:

    标签: c# razor entity-framework-6 asp.net-mvc-viewmodel asp.net-mvc-5.1


    【解决方案1】:

    MVC 在尝试重建您的模型时将寻找 name 属性设置为 Address.AddressIdinput 元素。

    添加

    <input type="hidden" name="Address.AddressId" value="" id="address" />
    

    @Html.HiddenFor(m => m.Address.AddressId, new { @id="address"})
    

    到您的表单,然后通过 jQuery 将其值设置为您需要的任何值。

    确保模型绑定语法正确的一种简单方法是简单地添加一个 EditorFor(m =&gt; m.Address.AddressId) 然后检查它为该输入元素上的 name 属性生成的内容

    【讨论】:

    • 但是视图中没有Address 对象。我们只有它的一个属性。
    • 你是对的,需要对属性的引用
    • 我认为您需要将控制器修改为 public ActionResult Create([Bind(Include="SiteId,Name,AddressId")] Site site) 才能识别 AddressId
    • 感谢@Jonesy 它对我有用!首先,我必须在我的控制器中删除与 Address 的绑定:public ActionResult Create([Bind(Include = "SiteId,Name")] Site site) 否则控制器会在 PostBack 上期待 Address。收到 PostBack 后,我再次将其绑定回 Site 实体:db.Entry(site.Address).State = EntityState.Added;
    【解决方案2】:

    好吧,无论如何,您需要将其放入隐藏的&lt;input /&gt; 元素中。我不熟悉 [Bind] 属性的详细信息,但我认为有一种方法可以输入名称来表示“这是站点地址的 addressId”。如果没有,只需将其设置为 Create 操作的另一个参数并在其中分配它。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      相关资源
      最近更新 更多