2009-05-20 4 views
0

У меня есть <input type='image'> в представлении ASP.NET MVC, но я не уверен, как получить координаты в действии, которое выполняется при отправке формы. Запрошенный URL выглядитASP.NET MVC маршрут для serveride imagemap

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

, но я не могу просто сделать

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

, потому что они, очевидно, не допустимые имена для C# параметров метода. Есть ли эквивалент атрибута ActionName для сопоставления параметров запроса с параметрами метода?

ответ

4

Вы должны использовать использование модели связующего и установить свойство префикса "Карта":

Сначала создайте объект 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; 

} 
1

Вы могли бы сделать класс как это:

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

, а затем использовать его в качестве параметра для метода действия

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

Чтобы ответить на ваш вопрос напрямую, вы можете изменить поле, которое используется для параметра, используя [Bind]:

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

Однако пользовательский ModelBinder, который привязал карту изображения к структуре System.Drawing.Point, будет приятнее.

Редактировать: Вот ImageMapBinder, который автоматически сопоставляется с аргументом System.Drawing.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); 
    } 
} 
Смежные вопросы