Чтобы ответить на ваш вопрос напрямую, вы можете изменить поле, используемое для параметра, используя [Bind]:
public ActionResult View([Bind(Prefix="map.x")] int x,
[Bind(Prefix="map.y")] int y )
Однако пользовательский ModelBinder, который связывает карту изображения со структурой System.Drawing.Point, будет лучше.
Редактировать: Вот ImageMapBinder, который автоматически сопоставляется с аргументом System.Drawing.Point. Вам не нужно украшать каждый аргумент Point атрибутом, если вы добавляете следующий код в Application_Start:
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);
}
}