【问题标题】:ModelView data not passed from View to ControllerModelView 数据未从 View 传递到 Controller
【发布时间】:2015-06-03 16:33:14
【问题描述】:

我的问题是从我的控制器传递到我的视图的强类型数据是空的(它的所有属性都是空的)。

我还想将单选按钮(标记为 QUESTION2)中的选定值绑定到模型属性“GivenAnwser”,但它似乎也不起作用。

传递的类型是 ViewModel

public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {  
            QuestionViewModel question = Manager.GetQuestion();
            return View(question);
        }

        [HttpPost]
        public ActionResult Index(QuestionViewModel question,Anwser givenAnwser)
        {      
            //QuestionViewModel  is returned but all it's properties are null.           
            return View(question);
        }
    }

查看

@model Quiz.ViewModels.QuestionViewModel
@{
    ViewBag.Title = "Home Page";
}

@Html.Label("Question:")

@if (Model.CorrectAnwser != null)
{
    //some code
}

@Html.DisplayFor(model => model.Question.Text)

//I have tried with Hidden fields and without them
@Html.HiddenFor(model => model.Question)
@Html.HiddenFor(model => model.Anwsers)
@using (Html.BeginForm("Index", "Home"))
{         
    foreach (var anwser in Model.Anwsers)
    {
        //QUESTION 2
        <input type="radio" name="givenAnwser" value="@anwser" />
        <label>@anwser.Text</label>
        <br />
    }
    <input type="submit" value="Check!" />
}

问题视图模型

public class QuestionViewModel
    {
        public QuestionViewModel()
        {
            this.Anwsers = new List<Anwser>();
        }

        public Question Question { get; set; }

        public List<Anwser> Anwsers { get; set; }

        public Anwser GivenAnwser { get; set; }

        public bool CorrectAnwser { get; set; }

    }

编辑: ModelState 包含错误:
“从类型 'System.String' 到类型 'Quiz.Models.Anwser' 的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。”

【问题讨论】:

  • 应该使用隐藏字段。 QuestionViewModel 是否具有无参数的公共构造函数,并且属性(Pytanie、Odpowiedzi)是否也可以读/写?是否将正确的值发布到隐藏字段?
  • @RobertMcKee 是的。我已将 ViewModel 的代码添加到帖子中。它确实将正确的值发布到隐藏字段。编辑:ModelState 无效。
  • 隐藏字段必须在表单内...这就是将发布到服务器的内容...
  • 我已经移动了 foreachloop 下的隐藏字段,但是没有任何变化。
  • 这只是一个提示......让我们一起思考,你有一个数组,怎么可能将它绑定到隐藏字段?另一个提示,Question 是一个复杂类型,隐藏的值只是一个字符串……你看到了吗?

标签: c# asp.net-mvc viewmodel


【解决方案1】:
 <input type="radio" name="givenAnwser" value="@anwser" />

此行将复杂类型“@answer”设置为单选按钮的值。 这可能只是在渲染期间执行类型的 ToString()。

当你把它发回时,MVC 可能会尝试将此字符串值转换回

Quiz.Models.Anwser

失败了。

你可能应该渲染

<input type="radio" name="givenAnwser" value="@anwser.SomeBooleanValue" />

附言还有,为什么不使用 Html 扩展来呈现单选按钮。

【讨论】:

    【解决方案2】:

    您不能将复杂类型(问题)绑定到隐藏字段。您需要绑定到单独的子属性。

    另外,对于答案,不要使用 foreach,使用 for 循环。喜欢:

    @for(var i=0;i<Answers.Count;i++)
    {
        <input type="radio" name="@Html.NameFor(a=>a.Answers[i].answer.Value)" value="@Model.Answers[i].anwser.Value" />
    }
    

    或

    @for(var i=0;i<Answers.Count;i++)
    {
        @Html.RadioButtonFor(a=>a.Answers[i].answer,Model.Answers[i].answer.Value)
    }
    

    虽然,这可能也不正确,因为 Answers 也是一个复杂类型的集合,而您没有分享它的定义。

    总而言之,我不认为您真的需要(或想要)回发整个模型。为什么不直接发回问题 ID 和选定的答案?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-15
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多