Asp.net mvc 4 模型绑定在mvc4中不起作用,它很简单,但我不能对它掉以轻心

Asp.net mvc 4 模型绑定在mvc4中不起作用,它很简单,但我不能对它掉以轻心,asp.net-mvc-4,model,Asp.net Mvc 4,Model,我不熟悉mvc的web开发方式,我有一个主控制器,它有两个操作索引和保存,还有一个名为MyModel的模型和一个静态类SomeData,该类将MyModel作为属性- SomeData是一个静态类,具有静态属性MyModel(属于我拥有的模型类类型)和静态方法getdata(),该方法返回对ModelClass的引用 public static MyModel MyModels; static SomeData() { MyModels = new MyMode

我不熟悉mvc的web开发方式,我有一个主控制器,它有两个操作索引和保存,还有一个名为MyModel的模型和一个静态类SomeData,该类将MyModel作为属性- SomeData是一个静态类,具有静态属性MyModel(属于我拥有的模型类类型)和静态方法getdata(),该方法返回对ModelClass的引用

public static MyModel MyModels;

    static SomeData()
    {
        MyModels = new MyModel { SomeValue = 100 , SomeString="ComingFromSomeData"};

    }

    public static MyModel getdata()
    {
        return MyModels;
    }
下面是两个动作方法,现在发生的是启动时动作索引调用getdata方法并绑定模型,我可以看到数据,但当我更改值并单击save时,它返回到动作“save”,我修改传递的属性(添加100并添加“bro”),并尝试再次将模型绑定到“save”视图(保存视图与索引视图类似,只是它还有一个ActionLink,可以再次导航到索引视图),问题是在“保存”视图中,我无法看到更改值,但如果我单击ActionLink并再次转到索引视图,我可以看到更改的值(已存储在静态类中)

模型如下所示

 public class MyModel
{
    private int _somevalue;

    [Required]
    public int SomeValue
    {
        get { return _somevalue; }
        set { _somevalue = value; }
    }
    [Required]
    public string SomeString
    {
        get;
        set;
    }

}
@model ValidationPractice.Models.MyModel
<form action="Home\Save" method="post">
    <label>SomeLabel</label>&nbsp&nbsp
    @Html.EditorFor(model => model.SomeValue)
    @Html.EditorFor(model=>model.SomeString)

    <input type="submit" />
</form>
和索引视图,如下所示

 public class MyModel
{
    private int _somevalue;

    [Required]
    public int SomeValue
    {
        get { return _somevalue; }
        set { _somevalue = value; }
    }
    [Required]
    public string SomeString
    {
        get;
        set;
    }

}
@model ValidationPractice.Models.MyModel
<form action="Home\Save" method="post">
    <label>SomeLabel</label>&nbsp&nbsp
    @Html.EditorFor(model => model.SomeValue)
    @Html.EditorFor(model=>model.SomeString)

    <input type="submit" />
</form>
@model ValidationPractice.Models.MyModel
SomeLabel
@EditorFor(model=>model.SomeValue)
@EditorFor(model=>model.SomeString)
并将视图另存为以下内容-

@model ValidationPractice.Models.MyModel
<form action="Home\Save">
<label>SomeLabel</label>&nbsp&nbsp
@Html.EditorFor(@model => model.SomeValue)
@Html.EditorFor(@model=>model.SomeString) <br />
@Model.SomeString
@Model.SomeValue<br />
<input type="submit" />
@Html.ActionLink("Clicktoreturn", "Index");
@model ValidationPractice.Models.MyModel
SomeLabel
@Html.EditorFor(@model=>model.SomeValue)
@Html.EditorFor(@model=>model.SomeString)
@Model.SomeString @Model.SomeValue
@ActionLink(“点击返回”、“索引”);


需要注意的是@Model.SomeString、@Model.SomeValue返回更新后的值,该值为200,来自SomeDataBro,但是绑定的模型lambda表达式@Model=>Model.SomeString没有…为什么会发生这种情况?

查看您的SomeData..使用SomeData.Init()在使用之前显式初始化MyModels。请尝试一下

public static class SomeData
{
    public static MyModel MyModels;
    public static Boolean Init()
    {
       SomeData.MyModels = new MyModel { SomeValue = 100 , SomeString="ComingFromSomeData"};
       return true;
    }

    public static void AddValue(int AValue) 
    {
       SomeData.MyModels.SomeValue += AValue;
    }

    public static void AppendString(string AString) 
    {
       SomeData.MyModels.SomeString += AString;
    }

    public static MyModel getData()
    {
       return SomeData.MyModels;
    }
}

查看您的SomeData..使用SomeData.Init()在使用之前显式初始化MyModels..试试看

public static class SomeData
{
    public static MyModel MyModels;
    public static Boolean Init()
    {
       SomeData.MyModels = new MyModel { SomeValue = 100 , SomeString="ComingFromSomeData"};
       return true;
    }

    public static void AddValue(int AValue) 
    {
       SomeData.MyModels.SomeValue += AValue;
    }

    public static void AppendString(string AString) 
    {
       SomeData.MyModels.SomeString += AString;
    }

    public static MyModel getData()
    {
       return SomeData.MyModels;
    }
}
更新: 您以错误的方式使用模型绑定:

@Html.EditorFor(@model => model.SomeValue) //
@Html.EditorFor(@model=>model.SomeString)  // What is @model...?! just model!
按如下方式更正Svae视图:

@model ValidationPractice.Models.MyModel
<form action="Home\Save">
<label>SomeLabel</label>&nbsp&nbsp
@Html.EditorFor(model => model.SomeValue)
@Html.EditorFor(model=>model.SomeString) <br />
@Model.SomeString
@Model.SomeValue<br />
<input type="submit" />
@Html.ActionLink("Clicktoreturn", "Index");
@model ValidationPractice.Models.MyModel
SomeLabel
@EditorFor(model=>model.SomeValue)
@Html.EditorFor(model=>model.SomeString)
@Model.SomeString @Model.SomeValue
@ActionLink(“点击返回”、“索引”);
下次,记得在你的问题中添加足够的相关代码;)

更新: 您以错误的方式使用模型绑定:

@Html.EditorFor(@model => model.SomeValue) //
@Html.EditorFor(@model=>model.SomeString)  // What is @model...?! just model!
按如下方式更正Svae视图:

@model ValidationPractice.Models.MyModel
<form action="Home\Save">
<label>SomeLabel</label>&nbsp&nbsp
@Html.EditorFor(model => model.SomeValue)
@Html.EditorFor(model=>model.SomeString) <br />
@Model.SomeString
@Model.SomeValue<br />
<input type="submit" />
@Html.ActionLink("Clicktoreturn", "Index");
@model ValidationPractice.Models.MyModel
SomeLabel
@EditorFor(model=>model.SomeValue)
@Html.EditorFor(model=>model.SomeString)
@Model.SomeString @Model.SomeValue
@ActionLink(“点击返回”、“索引”);

下一次,请记住在问题中添加足够的相关代码;)

首先,避免web应用程序中几乎任何静态的东西(除了少数例外,如扩展方法)

原因是静态数据不仅在用户的多个web请求之间共享,而且在用户之间共享。因此,如果您有两个用户访问您的网站,他们都将访问静态数据,您将得到不可预测的结果

其次,您应该使用Html.BeginForm帮助程序,而不是使用Html表单标记

第三,您没有正确设置表单标记。“Home\Save”是一种错误的斜杠,它应该是“Home/Save”,并且它也是相对url的。因此,如果您当前的URL是/Home/Index,那么当您单击提交按钮时,它将尝试提交到/Home/Index/Home\Save。如果您使用的是默认页面行为,其中/实际呈现/Home/Index,那么这可能会起作用,但一旦您位于不同的url,它就会失败


这就是为什么您应该使用helpers,因为它们为您找到了正确的路径。

首先,避免web应用程序中几乎任何静态的内容(除了少数例外,如扩展方法)

原因是静态数据不仅在用户的多个web请求之间共享,而且在用户之间共享。因此,如果您有两个用户访问您的网站,他们都将访问静态数据,您将得到不可预测的结果

其次,您应该使用Html.BeginForm帮助程序,而不是使用Html表单标记

第三,您没有正确设置表单标记。“Home\Save”是一种错误的斜杠,它应该是“Home/Save”,并且它也是相对url的。因此,如果您当前的URL是/Home/Index,那么当您单击提交按钮时,它将尝试提交到/Home/Index/Home\Save。如果您使用的是默认页面行为,其中/实际呈现/Home/Index,那么这可能会起作用,但一旦您位于不同的url,它就会失败


这就是为什么您应该使用helpers,因为它们为您找到了正确的路径。

只需查看代码的逻辑即可。似乎有些数据总是会初始化MyModel的一个新实例,称为“MyModels”。SomeData.MyModels.SomeValue将为100,SomeData.MyModels.SomeString将为“来自SomeData”。。您所做的任何更改都会在这些属性中添加100和“bro”。顺便说一句,欢迎来到stackoverflow。。我不得不复习你的问题好几次。。因为我不清楚你在期待什么样的行为。你也不熟悉使用静态函数/方法吗?我不理解这行“SomeData.MyModels”。。您没有将“SomeData”定义为静态类。。它目前被定义为一个静态方法(Sub),所以我不确定如何。。或者更重要的是。。为什么?您正在通过它访问MyModels(一个静态类/对象)。另外,由于SomeData不返回MyModel实例。。我不明白SomeData.ge是如何或为什么这样做的