我在视图中有这样的表
<table class='sendemailtable'>
@if (!string.IsNullOrEmpty(Model.CustomerName))
{
<tr>
<td style="font-size: 26px;">
@Html.Label(string.Empty, Model.CustomerName)
</td>
</tr>
}
<tr><td style="padding-top: 15px;">To:</td></tr>
<tr>
<td>
@Html.TextBoxFor(m => m.EmailTo)
@Html.ValidationMessageFor(m => m.EmailTo);
</td>
</tr>
<tr><td style="padding-top: 15px;">Subject:</td></tr>
<tr>
<td style="font-size: 22px;">
@Html.TextBoxFor(m => m.EmailBody)
</td>
</tr>
few more
<button style="..." type="submit">SEND</button>
</table>
这些不是来自模型的所有项目,它有一些更多的id,这些id在ui中不存在,只有一些属性只有getter
public int OfferID;
public int SomeOfferID;
public int CustomerID;
#region Email
[Required]
[DataType(DataType.EmailAddress)]
[RegularExpression(@"[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}", ErrorMessage = "Incorrect email")]
public string EmailTo;
private string emailBodyDefault;
public string EmailBody
{
get
{
if (string.IsNullOrEmpty(emailBodyDefault))
emailBodyDefault = string.Format("Hi,{1}please take a look. Offer ID: {0}{1}{1}Thanks", SomeOfferID, Environment.NewLine);
return emailBodyDefault;
}
set { emailBodyDefault = value; }
}
private string emailSubject;
[Required]
public string EmailSubject
{
get
{
if (string.IsNullOrEmpty(emailSubject))
emailSubject = string.Format("Offer ID: {0}", SomeOfferID);
return emailSubject;
}
set { emailSubject = value; }
}
#endregion
我想将我的模型传递给控制器,以便能够从控制器的动作发送电子邮件。还需要验证用户的电子邮件,以及用户点击发送时的非空主题。我怎么能这样做?
答案 0 :(得分:4)
如果要提交完整模型,则需要在表单中包含所有模型属性。如果您不希望显示它们,可以使用@Html.HiddenFor(m => m.YourPropertyName)
执行此操作。我在你的代码中没有看到任何表单标签,但我认为有一些吗?
您已经使用[Required] DataAnnotations对模型属性进行了验证,因此要在服务器端进行检查,您需要在将数据发布到控制器时检查ModelState.Valid。
public ActionResult SubmitMyForm(MyModel model)
{
if (ModelState.IsValid)
{
...
对评论的回应:
表单看起来像这样:
@using (Html.BeginForm())
{
<table>
...
</table>
}
发生错误是因为在using
块内,您不需要使用@
为C#代码添加前缀。有关说明,请参阅this answer。
答案 1 :(得分:2)
这些并非所有来自模型的项目,它都有一些更多的ID 目前在ui,有一些只有getter的属性
仅适用于GETTERS的属性
只有getter的属性,即使它们不是视图的一部分,它们仍然会从POST中保留它们的值。
例如,如果您有模型 -
public class MyModel1
{
public string name { get { return "Rami"; } }
public string email { get; set; }
}
你的控制器动作 -
public ActionResult Index()
{
MyModel1 m = new MyModel1();
m.email = "ramilu";
return View(m);
}
public ActionResult submit(MyModel1 m)
{
return null;
}
最后你的观点 -
@using (Html.BeginForm("submit", "New", FormMethod.Post))
{
@Html.LabelFor(model => model.email, new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.email)
@Html.ValidationMessageFor(model => model.email)
<input type="submit" value="Create" class="btn btn-default" />
}
当您点击提交按钮时,即使您在视图中没有名称属性,它仍将保持其值。
适用于使用GETTERS和SETTERS的属性
这些属性必须作为隐藏字段包含在表单中(或者可能通过在服务器上使用cookie或会话或缓存等通过其他方式)。否则他们就不会坚持自己的价值观。
例如 -
public class MyModel1
{
public string name { get; set; }
public string email { get; set; }
}
控制器操作 -
public ActionResult Index()
{
MyModel1 m = new MyModel1();
m.email = "ramilu";
m.email = "email";
return View(m);
}
public ActionResult submit(MyModel1 m)
{
return null;
}
索引视图 -
@using (Html.BeginForm("submit", "New", FormMethod.Post))
{
@Html.LabelFor(model => model.email, new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.email)
@Html.ValidationMessageFor(model => model.email)
@Html.HiddenFor(model => model.name);
<input type="submit" value="Create" class="btn btn-default" />
}
当您点击提交按钮时,您将获得所有属性值。在这里,我使用了隐藏的字段 -
还需要验证用户的电子邮件,以及用户时的非空主题 点击发送。我怎么能这样做?
您可以使用JQuery Unobstructive Validation with Model Data Annotations.
答案 2 :(得分:2)
通常,我使用TempData [] ..
在视图中:
<script>
$('form').submit(function() {
@{ TempData["FullModel"] = Model; }
});
</script>
控制器中的:
[HttpPost]
public void Controller()
{
YourModel model = (YourModel) TempData["FullModel"];
}
答案 3 :(得分:0)
您可以使用强类型视图和几个步骤来执行此操作
/// Use Strongly typed view (Type @Model yourModel)
/// Use @HTML.BeginForm and a button with type="Submit"
[HttpPost]
public void Controller(YourModel dodel)
{
// Here you will get data in model
}
答案 4 :(得分:0)
使用强类型视图总是更好。只有form标签下的所有东西都绑定到相应的模型,asp.net将html控件绑定到由name属性建模。因此,如果您希望整个模型完整无缺,请通过模型查看并将所有内容保存在表单标记下的hiddenfield中。