我有一个简单的ASP.NET MVC 3虚拟应用程序(只是学习来自WebForms的MVC)。
我对如何更新表单感到很困惑,而实际上并没有实际拥有一些数据库内容。我只有一个带有文本框的表单,按下按钮后我想看到大写的字符串。但我什么也没发生。
控制器:
public ActionResult Index()
{
ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" };
return View(model);
}
[HttpPost]
public ActionResult Index(ToUppercaseModel model)
{
model.TheString = model.TheString.ToUpper();
return View(model);
}
型号:
public class ToUppercaseModel
{
[Display(Name = "My String")]
public string TheString { get; set; }
}
观点:
@using (Html.BeginForm()) {
<div>
<div class="editor-label">
@Html.LabelFor(m => m.TheString)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.TheString)
</div>
<p>
<input type="submit" value="Convert" />
</p>
</div>
}
我觉得这很简单。现在显然第二个索引方法中的return View(model);
不起作用。我看到了一些关于RedirectToAction()
的内容并将数据存储在TempData
中。大多数示例只提交一些id,但因为我没有db不起作用。
如果我这样做:
return RedirectToAction("Index", model);
我得到了
没有为此对象定义无参数构造函数。
错误消息。这应该很简单,不是吗?我想我理解Post/Redirect/Get概念,但是没有看到如何将它应用于简单的事情。
感谢您的澄清。
答案 0 :(得分:1)
您必须从2方法调用1方法,但您必须更改它
公共ActionResult索引(ToUppercaseModel模型)
并将模型发送给1方法。
public ActionResult Index(ToUppercaseModel? model)
{
if (model == null)
ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" };
return View(model);
}
答案 1 :(得分:1)
当MVC呈现视图时,它将使用字段的尝试值而不是模型的值(如果存在)(例如,在我放置的日期字段中&#34;星期二&#34;,这赢得了&#39; t model bind但你想要向用户显示带有输入的字段并突出显示为无效),你要更改模型的值而不是尝试的值。
尝试的值保存在modelstate字典中:
ModelState["KeyToMyValue"].Value.Value.AttemptedValue
访问和更改这些值可能会非常棘手,除非您希望在代码中加载魔术字符串,并且在模型绑定时验证您的更改后的值将无法验证。
我在这些情况下的建议是调用ModelState.Clear()
,这将删除所有验证和尝试的值,然后直接更改您的模型。最后,您希望使用TryValidateModel(yourModel)
。
请注意,此方法可能是最简单的非hacky方法,但会删除无法从返回的视图绑定的尝试值。
答案 2 :(得分:0)
我想我得到了一个解决方案,它有效,但不确定这是不是应该如此? 基本上我只是将我的模型放入TempData并再次调用普通的Index方法。
public ActionResult Index()
{
ToUppercaseModel model = null;
if (TempData["FeaturedProduct"] == null)
{
model = new ToUppercaseModel { TheString = "testing" };
}
else
{
model = (ToUppercaseModel)TempData["FeaturedProduct"];
}
return View(model);
}
[HttpPost]
public ActionResult Index(ToUppercaseModel model)
{
model.TheString = model.TheString.ToUpper();
TempData["FeaturedProduct"] = model;
//return View(model);
return RedirectToAction("Index");
}