Извлечение значений атрибута из FormCollection в Asp.net MVC

Мое приложение записывает пользовательские атрибуты для элементов управления вводом, используя классы Helper. А также мы загружаем UserControl динамически, поэтому нам нужно использовать FormCollection для получения опубликованных значений. Есть ли способ, которым мы можем получить доступ к значениям атрибута из объекта FormCollection.

Пример:

<input type="text" name="textBox1" value="harsha" customAttr1 = "MyValue" />

Мой вопрос, как я могу получить доступ к значению customAttr1 из вышеупомянутого, например, из контроллера.

Спасибо за помощь в продвижении..

3 ответа

Как уже сказал Люк.. Form Collection является объектом словаря и содержит только имя, пару значений... для того, чтобы передать эту вещь в контроллер, вам нужно передать этот пользовательский атрибут через ajax.

var form = $("#formid").serialize(),
    custom = $("input:text").attr("customAttr1").val();
$.ajax({ 
    type: "POST", 
    url: "/controller/ProcessData", 
    data:{collection :form,customAttr: custom },
    dataType: "html", 
    traditional: true
});

в контроллере вам нужен следующий синтаксис:

public ActionResult ProcessData(FormCollection collection ,string customAttr)
{

в случае, если вам нужно передать несколько пользовательских значений, вам нужно вывести строковый массив из запроса ajax и сделать подпись контроллера, например:

public ActionResult ProcessData(FormCollection collection ,string[] customArray)
    {

Как устроен ваш помощник? Если он расширяет HtmlHelper, вы можете получить доступ к ViewContext.HttpContext.Request.Form, который является NameValueCollection; FormCollection используется механизмом связывания модели для отправки значений обратно в метод действия. Это не публично выставлено где-либо еще.

НТН.

Простой ответ - нет, боюсь, formCollection содержит только основную информацию о ключе и значении.

Может быть, вам будет легче повторно обработать эту информацию, когда вы окажетесь в контроллере? используя какую-то механику, чтобы определить, что вы передали.

Альтернативой является то, что если у вас есть список элементов управления, которые сопоставляются с базовым типом, то вы можете перебирать каждый элемент управления.

MVC немного волшебен и может отображать свойства обратно в модель, даже в список.

Если у вас есть модель со списком элементов управления:

public class Control
{
    String Value {get; set;}
    String Attribute1 {get; set;}
}

public class ControlViewModel
{
    IList<Control> Controls {get; set;}
}

тогда по вашему мнению:

for(var i = 0; i<controls.Count;i++)
{
   // Obviously this isnt complete right i needs to increment from 0; would be build using your htmlhelpers.
    <input id="Controls[i]_Value" name="Controls[i].Value" type="text" value="hello" />
    <input id="Controls[i]_Attribute1" name="Controls[i].Attribute1" type="hidden" value="Attribute" />
}

в вашем действии httppost вы можете собрать ControlViewModel и Controls список должен заполниться.

Я не проверял это, вероятно, есть много ошибок, но этого должно быть достаточно, чтобы начать; посты там, которые обсуждают это, если я найду их после публикации, я добавлю их.

Другие вопросы по тегам