2017-02-13 43 views
0

我使用其他字段搜索了数据库。数据库中只有1个项目。在编辑过程中,数据库中的实体ID映射不正确

var product= db.products.FirstOrDefault(x => x.nonID == id); 
     return product; 

例如项目的实际ID是:112 的nonID是888

当它返回到查看与查询字符串ID = 888

@Html.HiddenFor(model => model.ID) 

隐藏字段是地图到nonID而不是映射到已回顾的数据库中的实际ID。

当ID未找到时,这导致我保存问题。有人知道这是为什么发生? 产品类

public class product 
{ 

    [Display(Name = "ID")] 
    [Required(ErrorMessage = "Required.")] 
    public long ID { get; set; } 

    [Display(Name = "Search No")] 
    [Required(ErrorMessage = "Required.")] 
    public string nonID { get; set; } 

详细信息页面编辑页面事件

<input type="button" class="btn btn-info" value="Edit" onclick="location.href='@Url.Action("Edit","Product",new { id = Model.nonID})'" /> 


    public Product GetProductDetails(string id) 
    { 

     Product product = db.Products.FirstOrDefault(x => x.nonID == id); 

     return product; 
    } 

编辑页面隐藏字段

@Html.HiddenFor(model => model.ID) 

编辑页面查询字符串

Product/Edit/888 

编辑页面获取产品信息

public ActionResult Edit(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var product = service.GetProductDetails(id); 
     ViewBag.type = new SelectList(service.GetAllProductLibrary(), "ProductTypeID", "ProductTypeName", product.type); 
     if (product == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(product); 
    } 

保存编辑项目时。假设使用的112的ID保存。但ID没有被映射填充

+0

您需要在您的控制器方法中显示代码,并且型号 –

+0

添加了代码 –

+0

您仍然没有显示编辑GET方法的代码(这是最重要的位) –

回答

1

你的问题过程中,以查看实体的是,Edit方法具有被添加到ModelState当该方法被称为参数名称id。所有HtmlHelper方法,其生成表单控件使用值从ModelState设置value属性如果存在的话,是因为你的参数值是888,所产生的输入

<input .... value="888" /> 

就可以解决这个由前添加ModelState.Clear()返回视图,这意味着HiddenFor()方法将使用您的财产的价值。

甲替代解决方案将是,以该方法改变为

public ActionResult Edit(string nonID) 

,并在视图中使用@Url.Action("Edit","Product",new { nonID = Model.nonID})。如果你想输出../Product/Edit/xxx而不是../Product/Edit?nonID=xxx,那么你可以创建一个特定的路由定义。

+0

谢谢。我通过改变编辑参数来使用第二种方法,并且问题消失了。我一直认为它只是一个参数。但它会影响视图总体 –