我有一个联系表单,我传递两个值以强制用户回答一个简单的数学问题,以证明它不是发送表单的机器人。
查看模型
public class ContactFormViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public string MobileNumber { get; set; }
public ContactWho ContactWho { get; set; }
public string Message { get; set; }
public int Val1 { get; set; }
public int Val2 { get; set; }
public string Answer { get; set; }
public ContactFormViewModel()
{
var rnd = new Random();
Val1 = rnd.Next(1, 9);
Val2 = rnd.Next(6, 19);
}
}
视图模型将传递给控制器中的Get调用中的表单
private readonly object _cfvm = new ContactFormViewModel();
public IActionResult Contact()
{
return View(_cfvm);
}
viewmodel从模型的构造中获取两个值。通过查看控制器操作中传递的模型进行验证,然后通过在视图中放置断点进行验证。
查看
@model ContactFormViewModel
@{
ViewBag.Title = "Contact Us";
Layout = "~/Views/Shared/_LayoutTopLeft.cshtml";
}
@Html.HiddenFor(m => m.Val1, new { id = "answer_val1" })
@Html.HiddenFor(m => m.Val2, new { id = "answer_val2" })
@{
var answerPlaceholder = @"What is " + Model.Val1 + " + " +
Model.Val2 + "?";
}
这将生成答案文本框占位符的文本,其格式为"什么是5 + 12? (值来自视图模型)
正确创建answerPlaceholder但隐藏字段的值与模型不同。
实施例
现在运行它并且有三个断点,一个在控制器中查看Val1和Val2中的值,一个在HiddendFields的视图中,一个在answerPlaceholder中。控制器中Val1为8,Val2为11,视图中的模型和answerPlaceholder是正确创建的。
我不知道的是,在视图源中,隐藏字段的值不是8和11。
<input data-val="true" data-val-required="The Val1 field is required." id="answer_val1" name="Val1" type="hidden" value="1" />
<input data-val="true" data-val-required="The Val2 field is required." id="answer_val2" name="Val2" type="hidden" value="7" />
所以我尝试使用隐藏字段的新MVC 6方法。
<input asp-for="Val1" type="hidden" />
<input asp-for="Val2" type="hidden" />
但得到了相同的结果。
在表单填写过程中仅需要Val1和Val2,并且在回发表单数据时不使用。
当使用MVC5时,这对我来说总是这样,但现在我使用的是AspNet Core 2.0和MVC 6,并想知道这些框架中是否存在导致此问题的内容。我最好的猜测是在填充隐藏字段中的值时,会以某种方式创建viewmodel模型的另一个版本。
任何帮助都将不胜感激。
更新
根据Malcor的建议,视图模型已更改为删除构造函数,并且HttpGet方法已更改为在传递到视图之前在模型中添加值。
public IActionResult Contact()
{
var rnd = new Random();
var cvfm = new ContactFormViewModel
{
Val1 = rnd.Next(1, 9),
Val2 = rnd.Next(6, 19)
};
return View(cvfm);
}
现在一切正常。
答案 0 :(得分:0)
我认为这可能是因为你在类的构造函数中生成了新值。请记住,模型只定义数据的结构,视图正在构建它自己的类的版本,它从Rand生成新值。这可能会出现一些不寻常的行为。而不是在构造函数上生成值如果通过构造函数传递两个值会发生什么?我想你会得到一个错误,因为视图不知道如何处理构造函数参数。您可能最好实例化该类并直接传递Val1和Val2的值。