Как заставить мой тривиальный ASP.NET MVC DropDownList работать? - PullRequest
2 голосов
/ 06 мая 2011

Привет! Я пытаюсь заставить DropDownList работать в моем простом приложении. Я новичок Я уже провел несколько дней, просматривая различные инструкции в книгах и в Интернете, поэтому, если вы направите меня к одному, я уже был там. Моя ситуация действительно простая и тривиальная, но я не могу заставить ее работать. Я считаю, что лучший способ помочь мне - взглянуть на мой код.

Я загрузил свои проекты в SkyDrive, и я полагаю, что вам будет очень легко запускать мои проекты. Пока что список SelectList отображается в начальном представлении AddItem.

Вот проекты:

http://cid -5c0bc0a6f7bdc3c6.office.live.com / self.aspx / DebugB / DropDownTwo.zip

Папка содержит 2 проекта:

  • SHAWebService
    • SHAWebRole

Для запуска проектов:

  • Запустите SHAWebService.
    • Запустите SHAWebRole, он использует SHAWebService через порт 8080.
    • Перейдите на вкладку «AddItem», и вы увидите мой рендер SelectList в представлении AddItem.

Тогда у меня вопрос, как заставить его работать оттуда через представления Edit и Details?

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

SalesItemController выглядит следующим образом:

public ActionResult AddItem()
    {
        using (var WS = new SHAServiceReference.SHAServiceClient())
        {
            var categories = WS.GetCategories().ToList();

            IEnumerable<SelectListItem> lstCategory = categories.Select(cat => new SelectListItem
            {
                Value = Convert.ToString(cat.CategoryID),
                Text = cat.CategoryName
            });

            var salesItemModel = new SalesItemModel();
            // Retrieving the UserID of the user which is going to add a sales item.                
            salesItemModel.SellerUserID = 24; // Hardcoded only for this example           //(int)Session["userId"];
            salesItemModel.CategorySelectList = lstCategory;

            return View(salesItemModel);
        }
    }

    [HttpPost]
    public ActionResult AddItem(SalesItemModel salesItemModel, HttpPostedFileBase file)
    {
        if (ModelState.IsValid)
        {
            // This variable will capture the SalesItemID of the newly created SalesItem.
            var salesItemId = 0;
            //Attempt to add the SalesItem
            using (var WS = new SHAServiceReference.SHAServiceClient())
            {
                salesItemId = WS.AddSalesItem
                (
                    salesItemModel.SellerUserID,
                    salesItemModel.CategoryID,
                    salesItemModel.Title,
                    salesItemModel.Description,
                    salesItemModel.Price,
                    false
                );
                return View(salesItemModel);
            }
        }
        return View(salesItemModel);
    }

Вид AddItem выглядит следующим образом:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SHAWebRole.Models.SalesItemModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Add Item
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Add Item To Sell</h2>
    <% using (Html.BeginForm("AddItem", "SalesItem", FormMethod.Post, new { enctype = "multipart/form-data" }))
       {%>
    <%: Html.ValidationSummary(true)%>
    <fieldset>
        <legend>Fill in info about what you are selling</legend>
        <div id="userDiv">
            <%: Html.HiddenFor(model => model.SalesItemID)%>
            <%: Html.HiddenFor(model => model.SellerUserID)%>
            Sales Item Category
            <div>
                <%: Html.DropDownListFor(m => m.CategoryID, Model.CategorySelectList, "Select Category") %>
            </div>

Когда я получаю CategoryID и CategoryName в SalesItemController из веб-службы с помощью этого метода, var category = WS.GetCategories (). ToList ();

Я вызываю этот метод в веб-сервисе:

/* Returns a list with the Categories for SalesItems */
    public List<CategoryDto> GetCategoriesBL()
    {
        var categories = (from eachCategory in context.Categories
                          select new CategoryDto
                          {
                              CategoryID = eachCategory.CategoryID,
                              CategoryName = eachCategory.CategoryName
                          }
                           ).ToList();
        return categories;
    }

Объект передачи данных, который я использую в вышеуказанном методе (CategoryDto), выглядит следующим образом:

[DataContract]
public class CategoryDto
{
    [DataMember]
    public int CategoryID { get; set; }

    [DataMember]
    public string CategoryName { get; set; }
}

Окончательно SalesItemModel выглядит так:

 public class SalesItemModel
{
    public int SalesItemID { get; set; }

    public int SellerUserID { get; set; }

    public int CategoryID { get; set; }

    public IEnumerable<SelectListItem> CategorySelectList { get; set; }

В настоящее время DropDownList прекрасно отображается в начальном представлении AddItem, но когда я нажимаю кнопку «Добавить элемент», выдается следующее исключение:

«Элемент ViewData, имеющий ключ« CategoryID », имеет тип« System.Int32 », но должен иметь тип« IEnumerable »."

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

1 Ответ

2 голосов
/ 06 мая 2011

Хорошо, здесь, измените модель представления, чтобы включить свойство для выбранного значения. Также рекомендуется избегать использования ViewData, если это возможно, поэтому мы также можем добавить SelectListItems ...

public class SalesItemModel
{
    ...
    public IEnumerable<SelectListItem> CategorySelectList { get; set; }
    public int CategoryID { get; set; }
    ...
}

Теперь в контроллере измените список выбора, который также заполняется ...

var categories = WS.GetCategories().ToList();

IEnumerable<SelectListItem> lstCategory = categories.Select(x => new SelectListItem 
{ 
    Value = Convert.ToString(cat.CategoryID), 
    Text = cat.CategoryName 
});

var salesItemModel = new SalesItemModel();

salesItemModel.CategorySelectList = lstCategory;

в представлении также становится проще теперь, когда вы строго набрали selectlistitems ...

<% Html.DropDownListFor(m => m.CategoryID, Model.CategorySelectList, "Select Category") %>

и, наконец, измените действие публикации, чтобы использовать опубликованный выбор ...

salesItemId = WS.AddSalesItem
    (
        salesItemModel.SellerUserID,
        salesItemModel.CategoryID, //change here
        salesItemModel.Title,
        salesItemModel.Description,
        salesItemModel.Price,
        false
    );
...