Asp.net MVC 3 «преобразование параметра из типа System.String в тип не выполнено» при использовании выпадающего списка SelectList - PullRequest
0 голосов
/ 24 февраля 2012

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

Ситуация следующая:

Это Asp.Net MVC3 с проектом Entity Framework 4. И у меня есть два класса. Один файл конфигурации, а другой - действие. Между этими двумя есть отношения один ко многим. Вот упрощенный взгляд на код:

public class ConfigurationFile
{
    [Key, Required]
    [Column(TypeName = "uniqueidentifier")]
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Column(TypeName = "uniqueidentifier")]
    [Required]
    public Guid ActionId { get; set; }

    public virtual Models.Action Action { get; set; }
}

public class Action
{
    [Key, Required]
    [Column(TypeName = "uniqueidentifier")]
    public Guid Id { get; set; }

    [Required]
    public string ActionValue { get; set; }
}

Затем я хочу создать новый ConfigurationFile, и у меня есть два метода контроллера (и на данный момент это 95% сгенерированного кода Visual Studio 10):

// db is my context class.
//
// GET: /Configuration/Create
public ActionResult Create()
{
    ViewBag.ActionId = new SelectList(db.Actions, "Id", "ActionValue");
    return View();
}

//
// POST: /Configuration/Create
[HttpPost]
public ActionResult Create(Models.ConfigurationFile configurationfile)
{
    if (ModelState.IsValid)
    {
        configurationfile.Id = Guid.NewGuid();
        db.ConfigurationFiles.Add(configurationfile);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.ActionId = new SelectList(db.Actions, "Id", "ActionValue", configurationfile.ActionId);
    return View(configurationfile);
}

А вот фрагмент моего представления Create:

@model MyProject.Areas.ConfigurationFile.Models.ConfigurationFile

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Configuration File</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ActionId, "Action")
        </div>
        <div class="editor-field">
            @Html.DropDownList("ActionId", String.Empty)
            @Html.ValidationMessageFor(model => model.ActionId)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Когда я открываю страницу «Создать», я ясно вижу, что мой раскрывающийся список для класса «Действие» подходит (правильное значение - Action.Id - и текст - Action.ActionValue -), но при отправке формы , У меня возникает следующая ошибка: «Не удалось преобразовать параметр из типа« System.String »в тип« MyProject.Models.Action », поскольку преобразователь типов не может преобразовать эти типы».

Помогите пожалуйста !!

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

Вот так я и сделал, чтобы обойти проблему. Я просто изменил свой контроллер таким образом:

Models.Action act = db.Actions.Find(configurationfile.ActionId);
ModelState.Clear();
configurationfile.Action = act;

TryValidateModel(configurationfile);

И после этого проверка прошла нормально. Немного хакерский (и другой возможный удар по БД), но, по крайней мере, я могу продолжать.

0 голосов
/ 24 февраля 2012

Прямо сейчас MVC не имеет возможности подключить ваш выпадающий список из вашего представления к ActionId вашего объекта ConfigurationFile.

Я бы попробовал заменить эту строку:

@Html.DropDownList("ActionId", String.Empty)

для этого

@Html.DropDownListFor(model => model.ActionId, ViewBag.ActionId)

Кроме этого, я не могу думать о том, что еще ты мог сделать неправильно. Я надеюсь, что это помогает!

...