用于服务器端imagemap的ASP.NET MVC路由

时间:2009-05-20 12:33:08

标签: asp.net-mvc asp.net-mvc-routing imagemap

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

/Map/View/?map.x=156&map.y=196

但我不能这样做

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

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

5 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:4)

您必须使用Model binder并将prefix属性设置为“map”:

首先创建Model对象:

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;

}

答案 2 :(得分:1)

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

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

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

public ActionResult View(ImageMap map)
{
  ...
}

答案 3 :(得分:0)

试试IModelBinder。请参阅thisthisthis question

答案 4 :(得分:0)

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

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