C# 转换下拉列表项';s值为int

C# 转换下拉列表项';s值为int,c#,asp.net-mvc-3,entity-framework-4,razor,drop-down-menu,C#,Asp.net Mvc 3,Entity Framework 4,Razor,Drop Down Menu,我需要SelectListItem的值为int 所以我从数据库中提取它,在过程中将它转换为字符串,并存储为listitem的值 public class BookAdd { public BookAdd() { public Book Book { get; set; } DataModelContainer db = new DataModelContainer(); IEnumerable<SelectListItem> items = db.PublisherSet

我需要SelectListItem的值为int

所以我从数据库中提取它,在过程中将它转换为字符串,并存储为listitem的值

public class BookAdd
{
public BookAdd()
{
public Book Book { get; set; }
DataModelContainer db = new DataModelContainer();
IEnumerable<SelectListItem> items = db.PublisherSet
               .Select(i => new SelectListItem
               {
                 Value = SqlFunctions.StringConvert((double)i.Id), 
                 Text = i.Name
               });
    }
}
最后,控制人:

    public ActionResult Create2()
    {
        var bookAdd = new BookAdd();
        ViewBag.Publisher = bookAdd.items;
        return View(bookAdd);
    }

    //
    // POST: /Book/Create

    [HttpPost]
    public ActionResult Create2(BookAdd book)
    {
            if (ModelState.IsValid)
            {
                Book book2 = new Book();
                book2.Id = book.Book.Id;
                book2.AuthorId = book.Book.AuthorId;
                book2.Isbn = book.Book.Isbn;
                book2.Id = int.Parse(book.Book.PubId);
                book2.Title = book.Book.Title;
                book2.YearPublished = book.Book.YearPublished;

                db.BookSet.Add(book2);
                db.SaveChanges();
            }
            return RedirectToAction("Index");
    }

我使用的是MVC 3,EF 4。

当DropDownList的选定项将被发回时,将其从字符串转换为int,如convert.ToInt32(DropDownSelectedItem)或使用Int32.TryParse(value,out number)

开始时,您可以简化映射代码到

db
    .PublisherSet
    .Select(x=> new SelectListItem{Value = x.Id.ToString(), Text = x.Name})
    .ToArray();
在视图中,您可以执行以下操作:

@Html.DropDownListFor(model => model.Book.PublisherId, Model.items);
它将正确地呈现一个选择元素,并选择相应的选项和发布者

然后,当用户单击submit按钮时,可以使用模型绑定约定将其传递回控制器操作


最后,都是文字。这就是网络的本质。我们有很多技巧、转换器和活页夹来将字符串字典转换为丰富的视图模型,但最终它只是字符串。

我没有构建
SelectListItem
,而是构建了如下内容:

public struct BookItem
{
   int id;
   string name;
}
然后将以下项目添加到模型中并选择数据

IEnumerable<BookItem> bookList {get; set;}

您的映射代码只是导致:LINQ到实体无法识别方法'System.String ToString()'方法,并且此方法无法转换为存储表达式。我对LINQ表达式不感兴趣,它做的是正确的。我需要第二个片段来将值转换为int。模型绑定应该自动为您执行此操作。您能详细说明一下吗?我具体在哪里进行转换?例如:当您将数据发布回控制器/操作时,您可以进行转换。我希望我可以在model=>model.Book.publisherid上执行一些linq魔术,您如何将其接受到控制器中?如果命名合适,模型绑定可能会将其作为整数接受。您是否提交了完整的表格?您可能可以执行类似@Html.DropDownListFor(x=>Convert.ToInt32(x.Book.PublisherId)、Model.Items)的操作;但这只会给你的应用程序增加另一个故障点。我已经添加了控制器代码。。我将尝试您建议的转换,并让您知道,如果您对BookAdd模型具有适当的属性,resultsMVC模型绑定应该为您处理转换。你试过没有任何显式转换吗?如果你做了,结果如何?
IEnumerable<BookItem> bookList {get; set;}
@Html.DropDownListFor(model => model.Book.PublicherId, new SelectList(Model.bookList, "id", "name"))