2017-02-09 8 views
1

У меня есть проект ASP.NET MVC с объектами на основе EF6 (первая модель). Таким образом, мои сущности автоматически генерируются для меня. У меня есть объект, Site, и я просто хочу, чтобы пользователь выбирал Site, прежде чем продолжить. Я пробовал пару способов, все они работают, но они кажутся очень грязными и ненужными.Как передать идентификатор объекта из формы в действие в ASP.NET MVC

мне было интересно о чистейший способ создать DropdownList из Site с, а затем получить выбранный участок, когда форма передается (по Id или любой другой механизм лучше).

В настоящее время у меня есть:

индекс, где пользователю предлагается выбрать сайт:

public ActionResult Index() 
{ 
    ViewBag.Sites = new SelectList(db.Sites.ToList(), "Id", "Name"); 
    return View(); 
} 

Вид:

@using (Html.BeginForm("SetSite", "Home")) 
{ 
    @Html.Label("sites", "Site:"); 
    @Html.DropDownList("Sites", null, new { @class = "selectpicker" }); 

    <div style="width:100%;height:25px"></div> 
    <button class="btn btn-default" style="width:100%">Go</button> 
} 

И SetSite действие, где форма представленные

[HttpPost] 
public ActionResult SetSite() 
{ 
    if (Request.Form["Sites"] != null) 
    { 
     Session["Site"] = db.Sites.Find(Request.Form["Sites"]); 
     return RedirectToAction("Home"); 
    } 
    else 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
} 

Некоторые проблемы возникают из-за этого метода. Во-первых, я действительно хотел воспользоваться функциональностью @model в бритве и указать ее на мой класс Site, но так как он автогенерирован, я не хочу заглядывать и добавлять целую кучу свойств вида. (нищие не могут быть выбраны?)

Во-вторых, Request.Form['Sites'] возвращает строку, и преобразование ее в int и утка уродливо.

Как я уже говорил, я хотел бы использовать функциональность @model с Html.DropDownListFor. Это возможно при работе со списком Sites из БД?

Как я могу это сделать чисто?

+2

Почему вы не используете ViewModel? –

+0

@HamidMosalla Я не использую модель представления, потому что, когда я смотрю на автогенерируемые представления, созданные визуальной студией, они могут делать то, что я пытаюсь достичь, используя классы первой модели. Другими словами, VS смог использовать только один класс 'Site' для генерации представлений для CRUD. Итак, почему я не могу создать представление для выбора сайта таким же образом? Я хотел бы избежать создания дополнительных классов, если можно, а также продолжить те же дизайнерские паттеры, что и строительные леса. –

+1

Нет необходимости использовать Request.Form для этой простой операции CRUD. Перейдите с помощью @model и следуйте структуре MVC (Model-View-Controller) –

ответ

1

Решение 1: - Контроллер: -

private List<Country> GetCountries() 
     { 
      var list = new Entity.Result<List<Entity.Country>>(); 
      list = _context.Countries.Select(tc => new Entity.Country 
      { 
       Id = tc.Id, 
       Name = tc.Name, 
       IsdCode = tc.Code, 
      }).ToList(); 
      return list.Data.Select(x => new Country 
      { 
       id = x.Id, 
       Name = x.Name, 
      }).ToList(); 
     } 

HttpGet Метод: -

public ActionResult Add(int id) 
      { 

       try 
       { 

       } 
       catch (Exception ex) 
       { 

       } 
       finally 
       { 
        ViewBag.countryList = GetCountries(); 

       } 
       return View() 
      } 

Посмотреть метод: -

@Html.DropDownListFor(x => x.countryId, new SelectList(ViewBag.countryList, "id", "Name"), KahandasDhanji.Common.Localization.Application.Resources.ddlCountry, 
            new { @id = "ddlCountry", @rows = 1 }) 

В Http Post Форма Submitimg U ручка это значение модели в методе HTTPPOST.

Решение 2: - Класс FormCollection мы можем фиксировать значения формы в контроллере.

[HttpPost] 
public ActionResult Add(FormCollection form) 
{   
    string strDDLValue = form["Sites"].ToString(); 

    return View(MV); 
} 

Надежды на его работу !!!

+0

Спасибо за ваше решение ! Я пытаюсь его реализовать. В решении 2, что мне делать, если значение формы должно быть «int». У меня есть 'Convert.ToInt32 (Request.Form [" Id "])'? Это уродливо для меня. Есть ли способ лучше? –

+0

нет другого пути, который вы можете использовать из коллекций или создать viewmodel для обработки данных формы ... –

1

Вы можете использовать ViewModel, чтобы избежать преобразования строкового значения из Request.Form.Ниже, как ваш класс ViewModel должен выглядеть

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     this.DropdownItems = new List<SelectListItem>(); 
    } 

    public int SelectedSiteId { get; set; } 
    public List<SelectListItem> DropdownItems { get; set; } 
} 

Изменить метод действия прибудете в контроллере, как показано ниже

public ActionResult Index() 
{ 
    List<Site> sites = db.Sites.ToList(); 

    MyViewModel model = new MyViewModel(); 

    foreach(var site in sites) 
    { 
     model.DropdownItems.Add(new SelectListItem() { Text = site.Name, Value = site.ID.ToString() }); 
    } 

    return View(model); 
} 

Добавить @model MyViewModel на первой линии с вашей точки зрения кода и использовать Html.DropDownListFor метод для генерации dropdownlist

@model MyViewModel 

@using (Html.BeginForm("SetSite", "Home")) 
{ 
    @Html.Label("SelectedSiteId", "Site:"); 
    @Html.DropDownListFor(m => m.SelectedSiteId, Model.DropdownItems, new { @class = "selectpicker" }) 
    <div style="width:100%;height:25px"></div> 
    <button class="btn btn-default" style="width:100%">Go</button> 
} 

Метод post action в вашем контроллере должен выглядеть следующим образом. model.SelectedSiteId будет выбранным значением выпадающего списка, а тип - int, поэтому вам не нужно делать никаких преобразований, таких как Convert.ToInt32(Request.Form['Sites']).

[HttpPost] 
public ActionResult SetSite(MyViewModel model) 
{ 
    Session["Site"] = model.SelectedSiteId; 
    return RedirectToAction("Home"); 
}