0

我有<input type='image'>一个 ASP.NET MVC 视图,但我不确定如何在提交表单时运行的操作中检索坐标。请求的 URL 看起来像

/地图/视图/?map.x=156&map.y=196

但我不能只做

public ActionResult View( int map.x, int map.y )
{
  ...
}

因为它们显然不是 C# 方法参数的有效名称。是否有任何等效的ActionName属性将查询参数映射到方法参数?

4

5 回答 5

4

您必须使用模型绑定器并将前缀属性设置为“map”:

首先创建模型对象:

public class ImageMap()
{
  public int x{get;set;}
  public int y{get;set;}
}

在您的操作方法中:

public ActionResult About([Bind(Prefix="map")]ImageMap map)
{

   // do whatever you want here
    var xCord = map.x;

}
于 2009-05-20T12:59:58.933 回答
4

要直接回答您的问题,您可以使用 [Bind] 更改参数上使用的字段:

public ActionResult View([Bind(Prefix="map.x")] int x, 
    [Bind(Prefix="map.y")] int y )

但是,将图像映射绑定到 System.Drawing.Point 结构的自定义 ModelBinder 会更好。

编辑:这是一个自动映射到 System.Drawing.Point 参数的 ImageMapBinder。只要将以下代码添加到 Application_Start,您就不必使用属性来装饰每个 Point 参数:

ModelBinders.Binders.Add(typeof(Point), new ImageMapBinder());

尽管您仍然可以根据[Bind(Prefix="NotTheParameterName")]需要重命名输入。

ImageMapBinder 的代码如下:

public class ImageMapBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext)
    {
        int x, y;

        if (!(ParseValue(bindingContext, "x", out x) &&
            ParseValue(bindingContext, "y", out y)))
        {
            return Point.Empty;
        }

        return new Point(x, y);
    }

    private bool ParseValue(ModelBindingContext bindingContext, string value, 
        out int outValue)
    {
        string key = String.Concat(bindingContext.ModelName, ".", value);

        ValueProviderResult result = bindingContext.ValueProvider[key];

        if (result == null)
        {
            outValue = 0;
            return false;
        }

        return ParseResult(result, out outValue);
    }

    private bool ParseResult(ValueProviderResult result, out int outValue)
    {
        if (result.RawValue == null)
        {
            outValue = 0;
            return false;
        }

        string value = (result.RawValue is string[])
            ? ((string[])result.RawValue)[0]
            : result.AttemptedValue;

        return Int32.TryParse(value, out outValue);
    }
}
于 2009-05-20T13:24:21.833 回答
1

你可以像这样创建一个类:

public class ImageMap()
{
  public int x{get;set;}
  public int y{get;set;}
}

然后将其用作您的操作方法的参数

public ActionResult View(ImageMap map)
{
  ...
}
于 2009-05-20T12:39:11.143 回答
0

试试IModelBinders。看到这个这个这个问题

于 2009-05-20T12:39:15.497 回答
0

您可以尝试一种完全不同的方法,并使用以下链接中提供的代码构建您的图像映射。

http://www.avantprime.com/articles/view-article/9/asp.net-mvc-image-map-helper

于 2011-06-27T09:48:49.443 回答