2011-04-17 77 views
3

几个星期前我刚开始使用MVC3,并在编程阶段很年轻,但我仍然学习很多。我最近一直在使用模型,使用TextBoxFor和其他助手来填充我的“角色”模型的属性。MVC3将模型传递给控制器​​ - 接收空值

本质上我想要做的是定义一个模型,然后将它传递给我的控制器,但是,在我的模型中定义为静态值的任何属性都将作为运行时的空值传递。

下面是要了解什么是继续下去所需要的部分的一些片断..

Character.cs - Model 

    // Instances of manipulated objects. 
    otReal db = new otReal(); 

    public player newPlayer = new player(); 

    public byte[] conditions 
    { 
     get 
     { 
      return newPlayer.conditions; 
     } 
     set 
     { 
      byte[] array1 = null; 

      array1 = new byte[16 * 12 * 3];    

      newPlayer.conditions = array1; 
     } 
    } 

CharacterController.cs 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Submit(Character c) 
    { 
     // Add a new character to the database via LINQ to Entities.   
     otReal.AddToplayers(c.newPlayer); 
     otReal.players.AddObject(c.newPlayer); 
     otReal.SaveChanges(); 

     return View(); 
    } 

唯一的助手我已经在我看来是用户实际需要进行交互的人。如果我进入我的控制器并在那里设置值,它们将被设置为正确的值并且它将被插入。任何帮助将不胜感激!

Index.cshtml - View 
@using (Ajax.BeginForm("Submit", new AjaxOptions { OnComplete = "done" })) 
{ 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>New Character Information</legend> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Name, "Character 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.TownList) 
    </div> 
    <div class="editor-field"> 
     @* @Html.DropDownList("TownList", ViewData["TownList"] as SelectList)*@ 
     @Html.DropDownListFor(model => model.TownList, ViewData["TownList"] as SelectList) 
     @Html.ValidationMessageFor(model => model.TownList) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Sex) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.Sex, ViewData["sex"] as SelectList) 
     @Html.ValidationMessageFor(model => model.Sex) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Vocation) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("VocList", ViewData["VocList"] as SelectList) 
     @Html.ValidationMessageFor(model => model.Vocation) 
    </div> 
    <p> 
     <input id="button" type="submit" value="Create" /> 
    </p> 
    <div style="font-family: Tahoma; font-size: large" id="completeDiv" style="display: none;"> 
    </div> 
    <span></span> 
</fieldset> 

}

基本上我想在这里做的是创造我的模型,有一堆,每一个“字”将在数据库表中的基础值。通过这种方式,当玩家创建他/她的角色时,他/她将能够输入角色名称,性别,职业(职业),起始城镇,并且所有其他值将被填充在幕后并传递给控制器​​以进行创建。

+1

您可能需要向我们展示一些查看代码。特别是POST到CharacterController.Submit的形式() – 2011-04-17 23:28:45

+0

您能否提供更多信息,您正在尝试做什么,发生了哪些错误以及发生错误的代码行? – 2011-04-17 23:29:25

+0

我得到的错误是“条件”不能为空,因为它是SQL中的NOT NULLABLE列。然而,您看到的上述属性是我拥有的每个属性的基本设置,我几乎都是静态设置它或基于从视图传递的“值”进行设置。 – jhartzell 2011-04-18 01:38:55

回答

3

假设你想在“newPlayer”设置的值,那么你就可以更换该

public player newPlayer = new player(); 

与此

public player newPlayer { get; set; } 

默认的模型粘合剂将创造一切从岗位上的形式 - 没有必要在模型中实例化它。

+0

我真的很喜欢这个想法背后的概念ataddeini,但我不完全知道如何设置它与我目前的属性,因为我设置实例化对象的值,以上面的例子有点模糊。我想更多地了解它,因为它看起来正是我所需要的。 – jhartzell 2011-04-18 01:29:43

+0

啊,我想我现在明白你的问题了。我建议为用户可以编辑的数据部分使用单独的视图模型,然后在持久保存到数据库之前将其与任何共享数据结合使用。你最终会得到更多的课程,但从长远来看,它会让事情变得更加清洁。 [这里有更多的信息](http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/)。祝你好运。 – ataddeini 2011-04-18 02:00:20

+0

是的,我可能会采取这种做法。作为一个临时修复,仅仅用MVC测试更多,我只是用一个构造函数来设置Character,该构造函数在创建对象时设置所有这些值。 – jhartzell 2011-04-18 02:36:26

0

为我的模型创建一个构造函数,并在构造函数内部通过新实例化的播放器模型设置默认值。临时修复,直到我读入ataddeini的解决方案。感谢大家!

相关问题