Asp.net mvc 如何在MVC中省略/防止数据发送到控制器中的POST方法
我有一个使用模型的视图,我正在使用该信息创建表单。 我有三个步骤的形式是可选的或可能不会显示 问题是这些隐藏的部分与表单数据一起发布,破坏了业务逻辑。(我无法控制业务逻辑) 那么有没有办法告诉框架不要通过某些节或字段?也许是通过课堂或其他方式?Asp.net mvc 如何在MVC中省略/防止数据发送到控制器中的POST方法,asp.net-mvc,model-view-controller,Asp.net Mvc,Model View Controller,我有一个使用模型的视图,我正在使用该信息创建表单。 我有三个步骤的形式是可选的或可能不会显示 问题是这些隐藏的部分与表单数据一起发布,破坏了业务逻辑。(我无法控制业务逻辑) 那么有没有办法告诉框架不要通过某些节或字段?也许是通过课堂或其他方式? 我知道我可以根据需要使用AJAX发送某些节,但站点规范要求根据需要隐藏和显示这些节。Show/Hide将不允许/不允许将值发送到控制器 被禁用或不可编辑的元素(99%的时间)将返回为null/minVal 您可以使用脚本中的JQuery将视图中的元素设置
我知道我可以根据需要使用AJAX发送某些节,但站点规范要求根据需要隐藏和显示这些节。Show/Hide将不允许/不允许将值发送到
控制器
被禁用或不可编辑的元素(99%的时间)将返回为null
/minVal
您可以使用脚本中的JQuery
将视图中的元素设置为Disabled
:
$('#elementID').attr("disabled", true);
或者您可以使用DOM
命令:
document.getElementById('elementID').disabled = "true";
因此,您可以将字段同时设置为禁用
和隐藏
,使其既不显示也不填充。然后,在您的控制器中
您可以根据某些字段(最好是必填字段,如果有的话)是否为空来确定业务逻辑
您可以在C#
中这样检查:
对于字符串
:
if (string.IsNullOrWhiteSpace(Model.stringField))
{
ModelState.AddModelError("stringField", "This is an error.");
}
if (Model.dateTimeField == DateTime.MinValue)
{
ModelState.AddModelError("dateTimeField ", "This is an error.");
}
对于日期时间
:
if (string.IsNullOrWhiteSpace(Model.stringField))
{
ModelState.AddModelError("stringField", "This is an error.");
}
if (Model.dateTimeField == DateTime.MinValue)
{
ModelState.AddModelError("dateTimeField ", "This is an error.");
}
出于兴趣,以下是如何使用JQuery
隐藏/显示视图中的元素:
$('#elementID').hide();
$('#elementID').show();
虽然您可以在客户端执行此操作,但它不会阻止恶意攻击
我建议你读书
摘录:
仅指定包含的属性:
[HttpPost]
public ViewResult Edit([Bind(Include = "FirstName")] User user)
{
// ...
}
[HttpPost]
public ViewResult Edit([Bind(Exclude = "IsAdmin")] User user)
{
// ...
}
仅指定排除的属性:
[HttpPost]
public ViewResult Edit([Bind(Include = "FirstName")] User user)
{
// ...
}
[HttpPost]
public ViewResult Edit([Bind(Exclude = "IsAdmin")] User user)
{
// ...
}
使用TryUpdateModel()
使用接口
public interface IUserInputModel
{
string FirstName { get; set; }
}
public class User : IUserInputModel
{
public string FirstName { get; set; }
public bool IsAdmin { get; set; }
}
[HttpPost]
public ViewResult Edit()
{
var user = new User();
TryUpdateModel<IUserInputModel>(user);
// ...
}
最后,最推荐的方法是使用真实的ViewModel,而不是域模型:
public class UserInputViewModel
{
public string FirstName { get; set; }
}
好的,所以没有办法说“不要发布整个部分”?除了必须将每个单独的项目设置为禁用之外?据我所知,POST方法中预期作为参数的模型将完全按照预先确定的方式接收。然而,每个字段是否包含数据不是预先确定的。