简体   繁体   English

HTML.textBoxFor(x => x.Price,disabled = true)不会将值发布到控制器发布操作!

[英]HTML.textBoxFor(x=>x.Price, disabled = true) doesn't post the value to the controller post action!

Asp .net MVC 3 application... This is the View: Asp .net MVC 3应用程序......这是视图:

    Grupa: <%= Html.DropDownListFor(x => x.Grupa, Model.ListaGrupe) %> 
    Produsul: <%= Html.DropDownListFor(x => x.Produs, Model.ListaProduse) %> 
    Cantitate: <%=Html.TextBoxFor(x => x.Cantitate, new { style = "width: 100px;" })%>
    Pret: <%=Html.TextBoxFor(x => x.Pret, new { style = "width: 100px;", disabled = true})%>
    TVA: <%= Html.TextBoxFor(x => x.TVA, new { style = "width: 100px;", disabled = true })%>
    Valoare: <%= Html.TextBoxFor(x => x.NoTVA, new { style = "width: 120px;", disabled = true})%>
    Valoare cu TVA: <%=Html.TextBoxFor(x => x.Total, new { style = "width: 120px;", disabled = true})%>

I am using some JQuery to change Pret, TVA, NoTVA and Total based on the values in Grupa, Produs and Cantitate so I don't want the user to modify the values inside them. 我正在使用一些JQuery根据Grupa,Produs和Cantitate中的值更改Pret,TVA,NoTVA和Total,因此我不希望用户修改其中的值。 Probably disabled = true shoudn't be used. 可能残疾=真的不应该使用。 Then how can I make so the user can't modify the fields but the value to be posted to the controller's action? 那么我怎样才能使用户无法修改字段,而是将值发布到控制器的动作中?

You can also make them readonly rather than disabling them. 您也可以将它们设为只读而不是禁用它们。 On the other note, I think @Chris solution is better, that way your modified data will be posted back. 另一方面,我认为@Chris解决方案更好,这样您的修改后的数据就会被回发。

You can use Html.HiddenFor() and use a <span> or <div> instead. 您可以使用Html.HiddenFor()并使用<span><div>代替。 Their values will then be posted back. 然后会回发他们的价值观。

Well, this is what i did up to now, 嗯,这就是我现在所做的,
i didn't succeed to make a good, easy to use, readonly protection using encryption, 我没有成功使用加密制作一个好的,易于使用的只读保护,
but i did manage to do something that i think might just do. 但我确实设法做了一些我认为可能会做的事情。

how it works: 这个怎么运作:

  • When you use LockObject(o) an object, itterate the properties that have defined ProtectedAttribute defined for. 当您使用LockObject(o)对象时,请尝试为已定义的ProtectedAttribute定义的属性。

  • add the locked value to a list, specially made for this field. 将锁定值添加到专门为此字段设置的列表中。
    ! the list is kept in the user session (on the server side) 列表保存在用户会话中(在服务器端)

  • when the user submits the form, IsValid checks to see if the value is in the list of locked values. 当用户提交表单时, IsValid检查该值是否在锁定值列表中。 if yes, then it is all ok. 如果是,那就没关系了。 otherwise, it must have been changed somehow. 否则,它必须以某种方式改变。

! the number of values is not that big, and is temporary to the session, but if it is bothering someone, a simple lockList.remove(node); 值的数量不是那么大,并且对于会话来说是临时的,但是如果它困扰某人,则是一个简单的lockList.remove(node); can easly be added when a value is validated. 可以在验证值时轻松添加。
Note: this can cause problem when the user uses Back buttons or Resubmit a form using Refresh. 注意:当用户使用“后退”按钮或使用“刷新”重新提交表单时,这可能会导致问题。

tell me if you find any problems that this model does not take into account... 告诉我你是否发现这个模型没有考虑的任何问题......
+ the Equalization is very naive, so it works only with value-types for time be. +均衡是非常幼稚的,所以它只适用于值类型的时间。


Code: 码:

Created an attribute named ProtectedAttribute : 创建了一个名为ProtectedAttribute的属性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = false)]
public class ProtectedPropertyAttribute : ValidationAttribute
{
    private static Dictionary<string, LinkedList<object>> savedValues;
    static ProtectedPropertyAttribute()
    {
        savedValues = (Dictionary<string, LinkedList<object>>)HttpContext.Current.Session["ProtectedAttributeData"];
        if (savedValues != null) 
            return;
        savedValues = new Dictionary<string, LinkedList<object>>();
        HttpContext.Current.Session.Add("ProtectedAttributeData", savedValues);
    }

    public static void LockObject(object obj)
    {
        Type type = obj.GetType();
        foreach (PropertyInfo property in type.GetProperties())
        {
            LockProperty(obj, property);
        }
    }

    public static void LockProperty(object obj, PropertyInfo property)
    {
        ProtectedPropertyAttribute protectedAttribute =
            (ProtectedPropertyAttribute)
            property.GetCustomAttributes(typeof (ProtectedPropertyAttribute), false).FirstOrDefault();
        if (protectedAttribute == null)
            return;
        if(protectedAttribute.Identifier == null)
            protectedAttribute.Identifier = property.Name;

        LinkedList<object> list;
        if (!savedValues.TryGetValue(protectedAttribute.Identifier, out list))
        {
            list = new LinkedList<object>();
            savedValues.Add(protectedAttribute.Identifier, list);
        }
        list.AddLast(property.GetValue(obj, null));
    }

    public string Identifier { get; set; }

    public ProtectedPropertyAttribute()
    {
    }

    public ProtectedPropertyAttribute(string errorMessage) : base(errorMessage)
    {
    }

    public ProtectedPropertyAttribute(Func<string> errorMessageAccessor) : base(errorMessageAccessor)
    {
    }

    protected override ValidationResult IsValid (object value, ValidationContext validationContext)
    {
        LinkedList<object> lockedValues;

        if (Identifier == null)
            Identifier = validationContext.DisplayName;

        if (!savedValues.TryGetValue(Identifier, out lockedValues))
            return new ValidationResult(FormatErrorMessage(validationContext.MemberName), new[] { validationContext.MemberName });

        bool found = false;
        LinkedListNode<object> node = lockedValues.First;
        while (node != null)
        {
            if(node.Value.Equals(value))
            {
                found = true;
                break;
            }
            node = node.Next;
        }

        if(!found)
            return new ValidationResult(FormatErrorMessage(validationContext.MemberName), new[] { validationContext.MemberName });

        return ValidationResult.Success;
    }
}

place this attribute on any property of your model just as any other validation. 将此属性放在模型的任何属性上,就像任何其他验证一样。

public class TestViewModel : Controller
{
    [ProtectedProperty("You changed me. you bitch!")]
    public string DontChangeMe { get; set; }

    public string ChangeMe { get; set; }
}

in the controller, after you are finished with the viewmodel object, you call ProtectedAttribute.LockObject(myViewModel) 在控制器中,在完成viewmodel对象之后,调用ProtectedAttribute.LockObject(myViewModel)

public class TestController : Controller
{
    public ActionResult Index()
    {
        TestViewModel vm = new TestViewModel {ChangeMe = "a1", DontChangeMe = "b1"};
        ProtectedPropertyAttribute.LockObject(vm);
        return View(vm);
    }


    public string Submit(TestViewModel vm)
    {
        string errMessage;
        return !validate(out errMessage) ? "you are a baaad, man." + errMessage : "you are o.k";
    }

    private bool validate(out string errormessage)
    {
        if (ModelState.IsValid)
        {
            errormessage = null;
            return true;
        }

        StringBuilder sb = new StringBuilder();
        foreach (KeyValuePair<string, ModelState> pair in ModelState)
        {
            sb.Append(pair.Key);
            sb.Append(" : <br/>");

            foreach (ModelError err in pair.Value.Errors)
            {
                sb.Append(" - ");
                sb.Append(err.ErrorMessage);
                sb.Append("<br/>");
            }

            sb.Append("<br/>");
        }
        errormessage = sb.ToString();
        return false;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM