Sek*_*har 2 asp.net-mvc uniqueidentifier razor asp.net-mvc-3 asp.net-mvc-scaffolding
我有一个具有以下结构的表
GUID uniqueidentifier with default value newid(), and set as primary key
ID int
Description varchar(max)
Run Code Online (Sandbox Code Playgroud)
我使用visual studio创建了一个实体模型,并生成了用于编辑/删除等的视图(mvc scaffolding)
问题在于"编辑",当我点击该链接时,会显示带有正确数据的相应表单,但"保存"按钮根本不起作用.请注意,其他链接(删除,创建,详细信息)完美运行..
所以,当我点击"编辑"链接时,网址就是
HTTP://本地主机:10871 /管理/编辑/ e7d0c5ee-7782-411f-920E-7b0d93c924e1
并且表单显示正确,但保存按钮不起作用,不会发生网络活动.使用uniqueidentifers作为主键是特别的吗?
谢谢
- -码 - -
Edit.cshtml
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Domain</legend>
@Html.HiddenFor(model => model.GUID)
@Html.HiddenFor(model => model.ID)
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Run Code Online (Sandbox Code Playgroud)
--AdminController.cs--
// GET:/ Admin/Edit/5
public ActionResult Edit(Guid id)
{
Domain domain = db.Domains.Single(d => d.GUID == id);
return View(domain);
}
//
// POST: /Admin/Edit/5
[HttpPost]
public ActionResult Edit(Domain domain)
{
if (ModelState.IsValid)
{
db.Domains.Attach(domain);
db.ObjectStateManager.ChangeObjectState(domain, EntityState.Modified);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(domain);
}
Run Code Online (Sandbox Code Playgroud)
Edit2 为了回应ZippyV的评论,我在Edit.cshtml中添加了以下代码
<div class="editor-label">
@Html.LabelFor(model => model.ID)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ID)
@Html.ValidationMessageFor(model => model.ID)
</div>
Run Code Online (Sandbox Code Playgroud)
令我惊讶(或无知) - 显示GUID而不是ID

除此之外 - 当我在该字段中输入值(1,2或任何整数)时,我仍然会收到消息"字段ID必须是数字".
问题来自于您在视图模型上有一个名为ID的属性:
public class Domain
{
public int ID { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
同时你id在Edit控制器动作中调用了一个route参数:
public ActionResult Edit(Guid id)
{
...
}
Run Code Online (Sandbox Code Playgroud)
现在发生的事情是:Html助手(例如TextBoxFor,HiddenFor,...)在绑定值时总是首先查看模型状态(即查询字符串参数,路由值),并且只在最后它查看值中的值该模型.这就是所有Html帮助程序的工作原理,它是设计的.
所以你有以下几点:
@Html.HiddenFor(model => model.ID)
Run Code Online (Sandbox Code Playgroud)
ID 不是来自模型,而是来自您的Route数据(这是您的action参数中指定的Guid).这就是在视图模型和具有相同名称的操作参数中使用属性非常危险的原因.
一种可能的解决方法是将您的action参数重命名为其他内容:
public ActionResult Edit(Guid domainId)
{
Domain domain = db.Domains.Single(d => d.GUID == domainId);
return View(domain);
}
Run Code Online (Sandbox Code Playgroud)
当然,现在可能需要调整路径或使用查询字符串参数:controller/edit?domainId=d578b4b7-48ec-4846-8a49-2120c17b6441调用"编辑"操作.
| 归档时间: |
|
| 查看次数: |
2785 次 |
| 最近记录: |