查看模型虚拟属性和下拉列表

2023-12-25

我无法掌握创建视图模型并使用实体框架将该信息保存回数据库的正确方法,而且我似乎找不到我正在寻找的信息,所以如果我忽略了它,请原谅我。

我看到了这个帖子here https://stackoverflow.com/questions/5043213/mvc-drop-down-list-not-mapping-to-model他似乎在问同样的问题,但没有得到答案。

我的主要问题是,

出于编辑目的,如果我有ProductModel model有一个Warranty model关系,我应该使用virtual property Warranty在视图模型中或者我应该使用int WarrantyId?

如果我应该使用虚拟财产,为什么这段代码不保存Warranty适当地?

我是否需要明确标记或填充更新保修?

请注意,这确实会填充我的编辑视图并按预期选择列表。

我的(简化的)代码设置如下:

Model:

    public int ModelId{ get; set; }

    public int ModelNumber { get; set; }

    public virtual Warranty Warranty { get; set;}

查看型号:

    public int ModelId { get; set; }

    [Required(ErrorMessage = "Model Number required")]
    [StringLength(25, ErrorMessage = "Must be under 25 characters")]
    [Display(Name="Model Number")]
    public string ModelNumber { get; set; }

    //related objects and necesary properties
    public virtual Warranty Warranty { get; set; }

    public IEnumerable<SelectListItem> WarrantySelectListItems { get; set; }

控制器(获取):

public ActionResult Edit(int? id)
    {
        //check the id
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        //get the model and make sure the object is populated
        var model = _modelService.GetModel(id.Value);
        if (model == null)
        {
            return HttpNotFound();
        }

        //pass our entity (db) model to our view model
        var editModelModel = new EditModelModel();
        editModelModel.InjectFrom(model);

        //warranty select list
        editModelModel.WarrantySelectListItems = WarrantySelectList(editModelModel.Warranty.WarrantyId);

        //option multi select list
        editModelModel.OptionSelectListItems = OptionSelectList();

        return View(editModelModel);
    }

控制器(POST)(正在进行中):

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(EditModelModel editModelModel)
    {
        if (!ModelState.IsValid)
        {
            return View(editModelModel);
        }

        var modelEntity = new Model();
        modelEntity.InjectFrom(editModelModel);

        _modelService.Update(modelEntity);
        _unitOfWork.Save();

        return RedirectToAction("Index");
    }

视图(简化):

<div class="form-group">
        @Html.Label("Warranty", new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(x => x.Warranty.WarrantyId, Model.WarrantySelectListItems, "--Select--")
            @Html.ValidationMessageFor(model => model.Warranty.WarrantyId)
        </div>
    </div>

同样,我只想知道设置这些视图模型和模型的正确/最佳方法,以便 EF 完成尽可能多的工作。我觉得如果我必须创建一个WarrantyId领域,我做错了什么,但也许情况并非如此。

提前致谢。非常感谢任何见解/帮助。


出于编辑目的,如果我有一个 ProductModel 模型,其中包含 保修模型关系,我应该使用虚拟财产吗 视图模型中的保修还是应该使用 int WarrantyId?

你不使用virtual您的财产的关键字ViewModel,因为ViewModel与实体框架无关。 使用的原因virtual关键字是允许在实体框架中延迟加载。在你的情况下,如果你添加virtual关键字为 Product POCO 类中的 Warranty 导航属性,您可以访问 Warranty 属性,如下所示:

Model.Warranty.WarrantyId

它没有将保修信息保存到数据库中的原因是您需要在 Product 类中定义保修外键属性。

在您的情况下,如果您使用代码优先方法并且 Product 是您的 POCO 类,只需保持如下所示:

    public class Product
    {
        public int ModelId { get; set; }
        public int ModelNumber { get; set; }
        public int WarrantyId {get;set;}

        [ForeignKey("WarrantyId ")]
        public virtual Warranty Warranty { get; set; }
    }

然后你的 ViewModel :

    public class MyViewModel 
    {
        public Product Product { get; set; }
        public IEnumerable<SelectListItem> WarrantySelectListItems { get; set; }
    }

最后你的看法

  @model MyViewModel

  @Html.DropDownList("Product.Warranty.WarrantyId", Model.WarrantySelectListItems, "--Select--")
  @Html.ValidationMessageFor("Product.Warranty.WarrantyId")

当然,你需要改变你的action方法来满足ViewModel。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查看模型虚拟属性和下拉列表 的相关文章

随机推荐