Ryan Zahra Ответов: 3

Список в MVC привязки объектов


Я просто хочу связать список объектов, отобразить его и отправить обратно, прежде чем добавлять функциональность для добавления и удаления во время выполнения. Моя проблема до сих пор заключается в том, что я не могу получить список по почте. Вот мой код:

Модели
[Serializable]
public class Animal
{
    public int ID { get; set; }
    public string Name { get; set; }
}

[Serializable]
public class Animals
{
    public string FarmName { get; set; }
    public List Farm { get; set; }
}


Контроллер:
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var animals = new Animals();
        animals.FarmName = "My Small Farm";
        animals.Farm = new List();
        animals.Farm.Add(new Animal() { ID = 1, Name = "Dog" });
        animals.Farm.Add(new Animal() { ID = 2, Name = "Cat" });
        
        return View(animals);
    }

    [HttpPost]
    public ActionResult Index(Animals farm)
    {
        return View(farm);
    }
}


Смотреть:
@using MVCTest.Models
@model MVCTest.Models.Animals

@{
    ViewBag.Title = "Home Page";
}

@using (Html.BeginForm("Index", "Home"))
{   
     @Html.LabelFor(x => x.FarmName)
     @Html.TextBoxFor(x => x.FarmName)
        
    for (var i = 0; i < Model.Farm.Count; i++ )
    {
        @Html.LabelFor(x => x.Farm[i].ID)
        @Html.TextBoxFor(x => x.Farm[i].ID)
        
        @Html.LabelFor(x => x.Farm[i].Name)
        @Html.TextBoxFor(x => x.Farm[i].Name)
    }
    
    <input type="submit" value="Submit" />
}


Что я уже пробовал:

Я попытался использовать циклы foreach и for в представлении, однако оба они не отправили обратно начальные записи. Кроме того, я попытался добавить скрытое поле в цикл for, назвал его index и установил значение переменной "i". Однако и у меня это не сработало.

Я также пробовал изменять список<животные> В модели животных к IEnumerable&ЛТ;животные> и в контроллер, я сделал новый метод POST "общественная ActionResult индекс(звери, животные, интерфейс IEnumerable&ЛТ;животное&ГТ; фермы)". Однако я все равно получил null для переменной "ферма".

Я также попытался изменить LabelFor(x => x.Farm[i].ID) в HiddenFor(x => x.Farm[i].ID) однако генерируемый HTML-код выглядит следующим образом: <input data-val="true" data-val-number="идентификатор поля должен быть числом". data-val-required="поле ID обязательно". id="Farm_0__ID" name="Farm[0].ID" type="hidden" value="1">

Я знаю, что, должно быть, что-то упускаю, однако, я в растерянности после попытки в течение целых 2 дней. Любая помощь и/или указания на то, что я делаю неправильно, были бы очень признательны.

3 Ответов

Рейтинг:
2

Member 14085353

public JsonResult OppDetails(int Id)
       {
           var data = _crmNewCustomerService.GetOppById(Id).Data;
           var selected = data.ToList();
           List<OpportunityViewModel> opportunityData = new List<OpportunityViewModel>();
           foreach (var item in selected)
           {
               if (item.OpportunityTitle != null)
               {
                   OpportunityViewModel model = new OpportunityViewModel();
                   model.CustomerId = Convert.ToInt32(item.CustomerId);
                   model.OpportunityTitle = item.OpportunityTitle;
                   opportunityData.Add(model);
               }
               else
               {

               }
           }

           return Json(opportunityData , JsonRequestBehavior.AllowGet);


       }


Richard Deeming

Абсолютно ничего общего с этим (уже решенным) вопросом.

Рейтинг:
15

F-ES Sitecore

@using (Html.BeginForm("Index", "Home"))
{
    @Html.LabelFor(farm => farm.FarmName)
    @Html.TextBox("farm.FarmName", Model.FarmName)

    for (var i = 0; i < Model.Farm.Count; i++)
    {
        @Html.LabelFor(x => x.Farm[i].ID)
        @Html.TextBox(string.Format("farm.Farm[{0}].ID", i), Model.Farm[i].ID)

        @Html.LabelFor(x => x.Farm[i].Name)
        @Html.TextBox(string.Format("farm.Farm[{0}].Name", i), Model.Farm[i].Name)
    }
    
    <input type="submit" value="Submit" />
}


Вы также можете посмотреть на пользовательскую привязку

http://www.prideparrot.com/blog/archive/2012/6/customizing_property_binding_through_attributes[^]

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


Ryan Zahra

Спасибо! Это похоже на мое решение, когда я попробовал его, и оно сработало для меня. Не могли бы вы объяснить мне, почему вам пришлось изменить TextBoxFor на TextBox для имени фермы? В моем исходном коде он работал, однако в вашем решении мне пришлось изменить его, как и Ваш, чтобы вернуть имя фермы. Большое спасибо за вашу помощь!

F-ES Sitecore

Это было сделано для того, чтобы я мог сам создавать соответствующие имена, а не использовать те, которые дает вам текстовое поле. Привязка модели по умолчанию и помощники работают для сложных объектов (то есть объектов со свойствами), а также списков объектов, но помощники не могут генерировать правильные имена для списков, которые являются свойствами других объектов.

Ryan Zahra

Спасибо за разъяснение!

Рейтинг:
1