输入框和复杂类型的问题

时间:2014-06-06 21:02:36

标签: c# asp.net-mvc-4 twitter-bootstrap-3 razor-2

我正在尝试创建一个网页,允许用户使用输入框和保存按钮提交有关对象的信息。到目前为止,我发现使用基本类型(如字符串,整数,布尔值和双精度)使页面用于名称,数字等相对容易。我可以将这些基本信息输入到输入框中,并通过点击保存按钮获取要保存到数据库中的信息。

但是,我需要工作的最后一个输入字段是Location字段。此字段将保存为名为LatLng的复杂类型,其中包含纬度和经度值。我已经能够使用剃刀HTML表单元素EditorFor()正确显示输入框。它会自动创建两个输入框,一个用于Lat,另一个用于Long。

EX:

enter image description here

但似乎无论我输入到这些框中,存储在数据库中的值总是lat:0,long:0。

通过在我的模型文件中设置一个断点,我发现当它到达模型的时候,它的价值是'变量里面的变量'在位置已经{0,0}。

所以我的问题是: 我的代码是否有问题会导致从EditorFor()文本框传递的值在到达我的模型文件之前归零?或者是否有某种方法可以让我更深入地调试?

此代码来自我的视图页面。我删除了我认为不相关的所有内容以及除了名称和位置之外的所有其他字段,以显示一个对我有用的东西和一个不对我有用的东西:

<div class="row">
    <div class="col-md-12">
        <section id="createGenericModelForm">
            @using (Html.BeginForm("Create", "GenericModel", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
            {
                <div class="form-group">
                    @Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label" }) 
                    <div class="col-md-6">
                        @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
                    </div>      
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Location, new { @class = "col-md-2 control-label" }) 
                    <div class="col-md-6">
                        @Html.EditorFor(m => m.Location, new { @class = "form-control" })
                    </div>      
                </div>                  
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Create" class="btn btn-default" />
                    </div>
                </div>                 
             }        
        </section>
    </div>
</div>              

除了名称和位置之外,我还删除了模型页面中的所有内容:

public class GenericModel
{
    public GenericModel()
    {           
        Location = new LatLng(0, 0);
    }
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }

    private LatLng _Location;

    [Display(Name = "Location")]
    public LatLng Location
    {
        get
        {
            return _Location;
        }
        set
        {
            _Location = value ?? new LatLng(0, 0); //WHEN DEBUGGING THIS IS WHERE value = {0,0}
        }
    }
}

这是定义复杂类型LatLng的代码:

[ComplexType]
public class LatLng : IEquatable<LatLng>
{
    public LatLng(){ }
    public double Latitude { get; private set; }
    public double Longitude { get; private set; }

    public LatLng(double latitude, double longitude)
    {
        Latitude = Math.Min(Math.Max(-90.0, latitude), 90.0);
        Longitude = Math.Min(Math.Max(-180.0, longitude), 180.0);
    }       
    public override string ToString()
    {
        return string.Format("{0},{1}", Latitude, Longitude);
    }
    public override bool Equals(object obj)     
    {
        return obj is LatLng && this.Equals((LatLng)obj);
    }
    public bool Equals(LatLng other)
    {
        return this.Latitude == other.Latitude
            && this.Longitude == other.Longitude;
    }      
}

我是这些语言编程的新手,所以请耐心等待我。另外,如果您需要更多代码,请告诉我。

1 个答案:

答案 0 :(得分:1)

问题是LatLng类中的两个属性:

public double Latitude { get; private set; }
public double Longitude { get; private set; }

他们有私人二传手。

我看到你正在尝试做什么,你试图通过构造函数调用来设置它们,但这不是模型绑定器的工作方式。

当您发布该表单时,模型绑定器将执行以下操作:

  1. 创建模型的新实例
  2. 纬度和经度属性将根据相应表单字段中的值进行设置。
  3. 如果您想保留模型,那么您需要了解如何创建自定义模型绑定器并进行注册。它很直接,你可以完全控制。

    此外,在您的模型中,Location属性不需要getter或setter的任何实现:

    [Display(Name = "Location")]
    public LatLng Location { get; set; }
    

    您在构造函数中设置了默认值,如果Location为null,则只是忽略它,它不会将其设置为null。

相关问题