Javascript:在HTML表单隐藏输入字段中设置值

时间:2017-06-30 14:37:46

标签: javascript c# asp.net-mvc

使用javascript / jquery。 我希望为以

开头的每个字段执行此操作
  

查询。

queryForm['Foo'].value = queryForm['query.Foo'].value;
queryForm['Bar'].value = queryForm['query.Bar'].value;
queryForm['Baz'].value = queryForm['query.Baz'].value;

queryForm.submit();

仅当queryForm ['Foo']存在时才会出现。

上下文:(你不需要知道这个来回答我的问题,但很高兴知道上下文)

以上问题是因为修复/黑客攻击。因为我将原始模型放在ViewModel中。现在Query在QueryViewModel中。

@model QA.ViewModels.QueryViewModel
@using QA.ViewModels
@using QA.Enums
@{ 
    var query = Model.Query;
}
<div class="form-group">
    @Html.Required(model => query.Foo, "Describe the facts and circumstances that are relevant to the query", true, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-9">
        @Html.EditorFor(model => query.Foo, new { htmlAttributes = new { @class = "form-control qa-tinymce-content" } })
        @Html.ValidationMessageFor(model => query.Foo, "", new { @class = "text-danger" })
        @Html.Hidden("Foo")
    </div>
</div>

2 个答案:

答案 0 :(得分:2)

仔细阅读你在这里所做的事情:你将旧的ViewModel放在一个新的ViewModel中,你不想重命名部分中的字段名。

那么为什么不将所需的字段名添加到新的ViewModel中呢?

public Query Query { get; set; }

#region Variabeles in Query you do not wish to rename in the partial views.

public string Foo {
    get { return Query.Foo; }
    set { Query.Foo = value; }
}

#endregion 

答案 1 :(得分:1)

你可以通过简单的javascript轻松完成你的hack,如下所示(未经测试):

for (let propertyName in queryForm){
 if(!queryForm.hasOwnProperty(propertyName) || propertyName.indexOf("query.") !== 0){
   continue;
 }
 let shortPropertyName = propertyName.substring(6);
 if(!queryForm.hasOwnProperty(shortPropertyName)){
   continue;
 }
 queryForm[shortPropertyName].value = queryForm[propertyName].value;

 //if you want to delete the 'long' property:
 // delete queryForm[propertyName];
}
//// (use let or var at your preference)

但是,你应该真的问自己你为什么要做这些事情!

恕我直言,你最好选择适当而整洁的模型作为你的观点