我有<input type='image'>
一个 ASP.NET MVC 视图,但我不确定如何在提交表单时运行的操作中检索坐标。请求的 URL 看起来像
/地图/视图/?map.x=156&map.y=196
但我不能只做
public ActionResult View( int map.x, int map.y )
{
...
}
因为它们显然不是 C# 方法参数的有效名称。是否有任何等效的ActionName
属性将查询参数映射到方法参数?
我有<input type='image'>
一个 ASP.NET MVC 视图,但我不确定如何在提交表单时运行的操作中检索坐标。请求的 URL 看起来像
/地图/视图/?map.x=156&map.y=196
但我不能只做
public ActionResult View( int map.x, int map.y )
{
...
}
因为它们显然不是 C# 方法参数的有效名称。是否有任何等效的ActionName
属性将查询参数映射到方法参数?
您必须使用模型绑定器并将前缀属性设置为“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;
}
要直接回答您的问题,您可以使用 [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);
}
}
你可以像这样创建一个类:
public class ImageMap()
{
public int x{get;set;}
public int y{get;set;}
}
然后将其用作您的操作方法的参数
public ActionResult View(ImageMap map)
{
...
}
您可以尝试一种完全不同的方法,并使用以下链接中提供的代码构建您的图像映射。
http://www.avantprime.com/articles/view-article/9/asp.net-mvc-image-map-helper