![](/img/trans.png)
[英]How to pass model value from a view to a controller when clicking on the button in ASP.NET MVC
[英]asp.net mvc how to pass full model from view to controller
我在视图中有这样的表
<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在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
我想将我的模型传递给控制器,以便能够从控制器的动作发送电子邮件。 还需要验证用户的电子邮件,以及用户点击发送时的非空主题。 我怎样才能做到这一点 ?
如果要提交完整模型,则需要在表单中包含所有模型属性。 如果您不希望显示它们,可以使用@Html.HiddenFor(m => m.YourPropertyName)
执行此操作。 我在你的代码中没有看到任何表单标签,但我认为有一些?
您已经使用[Required] DataAnnotations对模型属性进行了验证,因此要在服务器端进行检查,您需要在将数据发布到控制器时检查ModelState.Valid。
public ActionResult SubmitMyForm(MyModel model)
{
if (ModelState.IsValid)
{
...
回复评论:
表单看起来像这样:
@using (Html.BeginForm())
{
<table>
...
</table>
}
发生错误是因为在using
块内部,您不需要使用@
前缀C#代码。 请参阅此答案以获得解释。
这些不是来自模型的所有项目,它有一些更多的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" />
}
当你点击提交按钮时,即使你没有视图中的name属性,它仍将保持其值。
对于有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" />
}
当您点击提交按钮时,您将获得所有属性值。 在这里我使用隐藏的字段 -
还需要验证用户的电子邮件,以及用户点击发送时的非空主题。 我怎样才能做到这一点 ?
通常,我正在使用TempData [] ..
在视图中:
<script>
$('form').submit(function() {
@{ TempData["FullModel"] = Model; }
});
</script>
在控制器中:
[HttpPost]
public void Controller()
{
YourModel model = (YourModel) TempData["FullModel"];
}
您可以使用强类型视图和几个步骤来执行此操作
/// 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
}
使用强类型视图总是更好。 只有form标签下的所有东西都绑定到相应的模型,asp.net将html控件绑定到由name属性建模。 因此,如果您希望整个模型完好无损,请通过模型查看并将所有内容保存在表单标记下的hiddenfield中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.