Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过帐时保留未绑定的viewmodel数据_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 过帐时保留未绑定的viewmodel数据

C# 过帐时保留未绑定的viewmodel数据,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我来自ASP.Net,目前正在逐渐习惯MVC 到目前为止,我已经找到了实现我想做的事情的方法,但是有了这个方法,我得到了一个“这不是最简单的方法”的时刻 场景: 我正在将一个报价应用程序迁移到具有现有数据库的MVC,以便自动生成模型类。我为需要向用户显示数据的每个控制器操作创建了一个viewmodel类 “编辑报价”视图模型如下所示: public class QuoteEdit_ViewModel { public SelectList DelLocations { get; set;

我来自ASP.Net,目前正在逐渐习惯MVC

到目前为止,我已经找到了实现我想做的事情的方法,但是有了这个方法,我得到了一个“这不是最简单的方法”的时刻

场景: 我正在将一个报价应用程序迁移到具有现有数据库的MVC,以便自动生成模型类。我为需要向用户显示数据的每个控制器操作创建了一个viewmodel类

“编辑报价”视图模型如下所示:

public class QuoteEdit_ViewModel
{
    public SelectList DelLocations { get; set; }

    public int QuoteID { get; set; }

    public string QuoteNo { get; set; }
    public string EnquiryNo { get; set; }
    public string SalesPerson { get; set; }
    public string Exceptions { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    [Required]
    [Display(Name = "Equipment Overview")]
    public string EquipmentOverview { get; set; }

    public DateTime Created { get; set; }
    public DateTime Modified { get; set; }

    [Required]
    public int? Validity { get; set; }

    [Required]
    [Display(Name = "Minimum Delivery Weeks")]
    public int? DeliveryMin { get; set; }

    [Required]
    [Display(Name = "Maximum Delivery Weeks")]
    public int? DeliveryMax { get; set; }

    [Required]
    [Display(Name = "Delivery Location")]
    public int? DelLocationID { get; set; }

    public List<Constants.QPT> PackTypes { get; set; }
    public List<Constants.QE> Equipments { get; set; }
    public List<Constants.QEEx> Extras { get; set; }
}
目前,我需要重新加载整个viewmodel,并重新填充视图中未绑定的任何字段,因为它们的值在发布过程中丢失

我在其他帖子中读到,你可以使用hiddenfor,但这也可以用于列表吗


这是正确的方法还是我完全忽略了MVC的要点?

不要使用
HiddenFor
。你走的路是正确的。我要做的唯一更改是将您的公共代码分解到另一个方法中,GET和POST操作都可以使用该方法

private void PopulateQuoteEditViewModel(QuoteEdit_ViewModel model)
{
    mode.DelLocations = DAL.GetDeliveryLocationDropdown();

    var QData = DAL.GetQuoteEditVM(model.QuoteID);
    model.QuoteNo = QData.QuoteNo;
    model.EnquiryNo = QData.EnquiryNo;
    model.SalesPerson = QData.SalesPerson;
    model.PackTypes = QData.PackTypes;
    model.Equipments = QData.Equipments;
    model.Extras = QData.Extras;
    model.Created = QData.Created;
    model.CreatedBy = QData.CreatedBy;
    model.Modified = QData.Modified;
    model.ModifiedBy = QData.ModifiedBy;
}
然后:

其他评论

  • 不要使用
    TryUpdateModel
    。这不是你在这里的习惯。正确的方法是映射视图模型中的已发布值。您可以手动执行此操作,也可以使用AutoMapper之类的库。不管是哪种方式,您都不希望在执行过程中基于原始发布数据随意覆盖数据库实体上的任何内容

  • 您不应该发布正在编辑的实体的ID,而应该依赖于通过路由参数从URL获取ID。如果URL更改为不同的ID,则实际上是在编辑不同的内容,您可以添加对象级权限等来控制谁可以编辑什么。但是,发布的ID是可以被操纵的,如果你不小心(因为你不在这里),那么用户可以篡改ID,弄乱他们可能不应该编辑的对象


  • 不要使用
    HiddenFor
    。你走的路是正确的。我要做的唯一更改是将您的公共代码分解到另一个方法中,GET和POST操作都可以使用该方法

    private void PopulateQuoteEditViewModel(QuoteEdit_ViewModel model)
    {
        mode.DelLocations = DAL.GetDeliveryLocationDropdown();
    
        var QData = DAL.GetQuoteEditVM(model.QuoteID);
        model.QuoteNo = QData.QuoteNo;
        model.EnquiryNo = QData.EnquiryNo;
        model.SalesPerson = QData.SalesPerson;
        model.PackTypes = QData.PackTypes;
        model.Equipments = QData.Equipments;
        model.Extras = QData.Extras;
        model.Created = QData.Created;
        model.CreatedBy = QData.CreatedBy;
        model.Modified = QData.Modified;
        model.ModifiedBy = QData.ModifiedBy;
    }
    
    然后:

    其他评论

  • 不要使用
    TryUpdateModel
    。这不是你在这里的习惯。正确的方法是映射视图模型中的已发布值。您可以手动执行此操作,也可以使用AutoMapper之类的库。不管是哪种方式,您都不希望在执行过程中基于原始发布数据随意覆盖数据库实体上的任何内容

  • 您不应该发布正在编辑的实体的ID,而应该依赖于通过路由参数从URL获取ID。如果URL更改为不同的ID,则实际上是在编辑不同的内容,您可以添加对象级权限等来控制谁可以编辑什么。但是,发布的ID是可以被操纵的,如果你不小心(因为你不在这里),那么用户可以篡改ID,弄乱他们可能不应该编辑的对象


  • 谢谢你的反馈。我将研究代码的分解,并阅读AutoMapper和route参数。感谢您的反馈。我将研究代码的分解,并阅读AutoMapper和route参数。
    public ActionResult QuoteEdit()
    {
        var model = new QuoteEdit_ViewModel();
    
        PopulateQuoteEditViewModel(model);
        return View(model);
    }
    
    [HttpPost]
    public ActionResult QuoteEdit(QuoteEdit_ViewModel model)
    {
        if (ModelState.IsValid)
        {
            ...
        }
    
        PopulateQuoteEditViewModel(model);
        return View(model);
    }