Asp.net mvc 如何使hiddenfor具有真正的价值

Asp.net mvc 如何使hiddenfor具有真正的价值,asp.net-mvc,Asp.net Mvc,我的表单必须将布尔值设置为true,但用户无法与控件交互以更改此值 我认为最好的方法是使用HiddenFor,因为出于各种原因,不希望在控制器中设置它,但我无法将布尔值设置为true 我的代码 @using (Html.BeginForm()) { @Html.LabelFor(mod => mod.EmailAddress)<br /> @Html.TextBoxF

我的表单必须将布尔值设置为true,但用户无法与控件交互以更改此值

我认为最好的方法是使用
HiddenFor
,因为出于各种原因,不希望在控制器中设置它,但我无法将布尔值设置为true

我的代码

            @using (Html.BeginForm())
            {
                @Html.LabelFor(mod => mod.EmailAddress)<br />
                @Html.TextBoxFor(mod => mod.EmailAddress)

                @Html.HiddenFor(mod => mod.IsSubsribed, new { value = true })
            }

我需要做什么

助手方法将最终呈现输入元素。那么为什么不写一个隐藏的输入元素标记呢

<input type="hidden" name="IsSubsribed" value="true" />
值中的V应该是上限,这样才能起作用

但请记住,用户仍然可以更新此值并发送它。因此,不要依赖来自客户的价值观。如果您知道这应该始终为真,请在http post操作方法(服务器代码)中使用
true
,而不是依赖来自客户端浏览器的此值


简而言之,不要盲目信任来自客户端浏览器的数据。调用时可以轻松地更改它:
@Html.HiddenFor(mod=>mod.issubscribed)

如果
issubscribed
为true,它将呈现:

<input type="hidden" name="IsSubsribed" value="true" />
<input type="hidden" name="IsSubsribed" value="false" />
如果这确实是一个用户无法修改的参数,更好的约定是使用一个隐藏的输入来唯一标识正在编辑的对象,然后在给定主键值的控制器方法中执行健全性检查

型号

class MyModel
{
    public string PrimaryKey { get; set; }
    public string EmailAddress { get; set; }
}
查看

@model MyModel
@using (Html.BeginForm())
{
    @Html.HiddenFor(m => m.PrimaryKey)
    @Html.TextBoxFor(m => m.EmailAddress)
    <button type="submit">Submit</button>
}

如果用户无法与该值交互,为什么要将其包含在视图中?为什么不在控制器的POST操作中将其硬编码为
true
?您不能在模型/控制器内部将
issubscribed
初始化为true吗?属性中的任何值都将绑定到控件。
“用户将无法与控件交互以更改此值”
-是的,他们会。很容易。如果用户不能更改该值,则该值首先不应出现在页面上。在服务器端保留服务器端规则。@David,这是一个隐藏字段!用户如何与之交互?@MyDaftQuestions:任何用户都可以向您的服务器发送他们想要的任何数据。这是否意味着不能使用
HiddenFor
?我的问题不是我该做什么,而是我该怎么做!了解差异,而不是哪种方式最好:)
class MyModel
{
    public string PrimaryKey { get; set; }
    public string EmailAddress { get; set; }
}
@model MyModel
@using (Html.BeginForm())
{
    @Html.HiddenFor(m => m.PrimaryKey)
    @Html.TextBoxFor(m => m.EmailAddress)
    <button type="submit">Submit</button>
}
[HttpPost]
public ActionResult ProcessModel(MyModel model)
{
    if(ModelState.IsValid)
    {
        // lookup information based on model.PrimaryKey
        // process 'IsSubscribed...'
        // etc...

        // redirect to appropriate view
    }
    // invalid model state, return View for model
}