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

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

Пример:

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

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

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


person Harsha    schedule 27.01.2011    source источник


Ответы (3)


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

ХТН.

person Brian Mains    schedule 27.01.2011
comment
Мне нужно получить к нему доступ из моего метода ActionResult. - person Harsha; 27.01.2011
comment
Пользовательский результат действия? В методе Execute? Если это правда, контекст контроллера имеет ссылку на контекст HTTP. В противном случае опубликуйте дополнительную информацию, и я могу помочь вам в дальнейшем... - person Brian Mains; 27.01.2011

Простой ответ: не боюсь, 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 должен заполниться.

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

person Luke Duddridge    schedule 27.01.2011
comment
Привет, я привел пример. Пожалуйста, посмотрите на него и объясните, возможно ли это. - person Harsha; 27.01.2011
comment
Я начал с того, что сказал, что это невозможно. FormCollection собирает только значение и ключ. - person Luke Duddridge; 28.01.2011

Как уже сказал Люк.. Коллекция форм является объектом словаря и содержит только пару имя, значение.. чтобы получить эту вещь в контроллере, вам нужно передать этот настраиваемый атрибут через 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)
    {
person ZeNo    schedule 31.03.2011