【问题标题】:Problems with input boxs and Complex types输入框和复杂类型的问题
【发布时间】:2014-06-06 21:02:35
【问题描述】:

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

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

前:

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

通过在我的模型文件中设置断点,我发现当它到达模型时,Location 中“set”中的“value”变量已经是 {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;
    }      
}

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

【问题讨论】:

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


    【解决方案1】:

    问题在于您的 LatLng 类中的两个属性:

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

    他们有一个私人二传手。

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

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

    1. 创建模型的新实例
    2. 纬度和经度属性将根据相应表单字段中的值进行设置。

    如果您想让模型保持原样,您需要了解如何创建自定义模型绑定器并进行注册。这很简单,您将拥有完全的控制权。

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

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

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

    【讨论】:

    • 我可以发誓我已经尝试过了,但没有成功。刚刚又试了一次,现在它完美地工作了。非常感谢!
    • 没问题,仅供参考,而不是[Display(Name=..],还有另一个名为[DisplayName("some name")]的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多