ASP.NET MVC маршрут для серверной карты изображений - PullRequest
0 голосов
/ 20 мая 2009

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 20 мая 2009

Чтобы ответить на ваш вопрос напрямую, вы можете изменить поле, используемое для параметра, используя [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);
    }
}
4 голосов
/ 20 мая 2009

Вы должны использовать связыватель модели и установить для префикса свойство 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;

}
1 голос
/ 20 мая 2009

Вы можете создать класс, подобный этому:

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

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

public ActionResult View(ImageMap map)
{
  ...
}
0 голосов
/ 27 июня 2011

Вы можете попробовать совершенно другой подход и создать свою карту изображений, используя код, указанный в следующей ссылке.

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

0 голосов
/ 20 мая 2009

Попробуйте IModelBinder с. См. это , это и этот вопрос .

...