禁用表单元素ASP.NET MVC更新

时间:2009-09-04 11:27:10

标签: asp.net-mvc

我想更新数据库中有两个值的记录,一个是ID,一个是“描述”。 ID永远不会被更改,但我依赖于使用强类型功能来实现它。所以,我有以下内容:

Inherits="System.Web.Mvc.ViewPage<Business>"

这很好,因为它可以让我把所有东西都拿回来。问题是当我使用以下行时:

<%= Html.TextBox("BusinessID", ViewData.Model.BusinessID, new { disabled = "disabled", style = "width:50px;", @class = "uppercase", maxlength = "4" })%>

使用disabled = "disabled"选项时,它无法识别BusinessID,因此不会将其传递回控制器,而控制器又会在绑定对象时出现问题。

不是你需要它,但这是控制器动作:

[HttpPost]
public ActionResult EditBusiness(Business business)
{
  if (!ModelState.IsValid)
    return View(business);
  // update business here
  _contractsControlRepository.UpdateBusiness(business);
  return RedirectToAction("Businesses");
}

为什么会发生这种情况?当他们被禁用时,我没有意识到表单元素完全隐藏在回发上。我不希望用户编辑该特定字段。我也试过Html.DisplayFor(b=>b.BusinessID)而没有任何运气。

4 个答案:

答案 0 :(得分:3)

显示像这样的ID

Html.Hidden("BusinessID", ViewData.Model.BusinessID)
<%=Model.BussinessID %>

这样你就可以在隐藏标签中获得绑定的id 并且您将在标签中显示该值 或者你可以使用你想要的任何其他东西你也可以这样做

 <input type="text" value="<%=Model.BussinessID %>" contentEditable="false"> 

并将隐藏的内容放在表格中

答案 1 :(得分:0)

而不是Html.Textbox你可以使用Html.Hidden(“BusinessID”,ViewData.Model.BusinessID)

答案 2 :(得分:0)

您是否有特殊原因要显示ID?如果没有,那么将它留在控制器上,只需使用TryUpdateModel()代替。

或者这不是你的要求?

修改

<%= Html.TextBox("name","value", null, new { style="readonly"}) %>

修改2

你可能会考虑做一个像// site / controller / yourbusinessid

这样的路线

然后您可以使用ID传递给您的控制器,然后您可以在视图中使用<%= Model.BusinessId %>作为字符串。

答案 3 :(得分:0)

你总是可以选择“硬编码”html元素,或者编写你自己的html帮助方法来实现它。

public static string DisabledTextBox(this HtmlHelper helper, string name, object value)
{
    return String.Format(@"<input type="text" name="{0}" id="{0}" disabled="disabled" value="{1}" />", name, value);
}