Извлечение значений атрибута из 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
список должен заполниться.
Я не проверял это, вероятно, есть много ошибок, но этого должно быть достаточно, чтобы начать; посты там, которые обсуждают это, если я найду их после публикации, я добавлю их.